Dobry den
Mam takovy problem
Naprogramoval sem si takovy jednoduchy game engin, obsahuje trydu, neake funkce a metody a ldyz ho potom includuju do jinyho projektu a ten zkompiluju (uz doptogramovany), nakonec to nahlasy chybu
[Linker error] undefined reference to `GameEngine::GameEngine(HINSTANCE__*, char*, int, int)'
[Linker error] undefined reference to `Bitmap::Bitmap(HDC__*, char*)'
a jeste par podobnych
delam to v dev-c++
prosim pomoc
Fórum › C / C++
Link error
Zvláštní, že jednoduchý engine který jsi "naprogramoval", odpovídá podle výpisu linkeru přesně enginu Michaela Morrisona z knihy "Naučte se programovat počítačové hry za 24 hodin". Celkově je tvůj dotaz položený dost vtipně, ale to teď není podstatné...
Otevři Projekt->Vlastnosti projektu->Parametry a k linkeru připiš
C:/Dev-Cpp/lib/libmsimg32.a nebo ( -lmsimg32)
C:/Dev-Cpp/lib/libwinmm.a nebo ( -lwinmm)
V souboru Bitmap.cpp (ha :)) napiš nad include - #define WINVER 0x0500. S tím to zkompiluj a pak už to WINVER nebudeš potřebovat (myslím že vyhodí warning), tak to klidně zakomentuj...
No "trochu" je to podle te knihy
Dost mi pomohla a abych se uplne "neopicil" trochu sem si to upravil
Ale zase to nejede
Nejede mi ta metoda GetEngine co vraci ukazatel na tu tridu, taky to pise link error, undefined references to GameEngine::m_pGameEngine
Co s tim
tucna píše:#
# Zvláštní, že jednoduchý engine který jsi "naprogramoval", odpovídá podle výpisu linkeru přesně enginu Michaela Morrisona z knihy "Naučte se programovat počítačové hry za 24 hodin". Celkově je tvůj dotaz položený dost vtipně, ale to teď není podstatné...#
##
#Otevři Projekt->Vlastnosti projektu->Parametry a k linkeru připiš#
#C:/Dev-Cpp/lib/libmsimg32.a nebo ( -lmsimg32)#
#C:/Dev-Cpp/lib/libwinmm.a nebo ( -lwinmm)#
##
#V souboru Bitmap.cpp (ha :)) napiš nad include - #define WINVER 0x0500. S tím to zkompiluj a pak už to WINVER nebudeš potřebovat (myslím že vyhodí warning), tak to klidně zakomentuj...#
##
##
#
Nechapu jak jsi z hlasky:
[Linker error] undefined reference to `GameEngine::GameEngine(HINSTANCE__*, char*, int, int)'
[Linker error] undefined reference to `Bitmap::Bitmap(HDC__*, char*)'
Vydedukoval, ze potrebuje prilinkovat knihovny Windows. Pokud jsem si to precetl radne,tak mu o API fce zatim nejde.
To max:
Koukni se, jestli mas includovan hlavickovy soubor s deklaraci tridy GameEngine v souboru, kde mas definovanou metodu vracejici ukazatel. Jinak takhle se docela saptne radi, kdyz nemame moznost videt kod.
Jo asi mam, ale stejne to nejede
GameEngine.h
class GameEngine
{
protected:
static GameEngine* m_pEngine;
public:
static GameEngine* GetMyEngine() {return m_pEngine; };
}
GameEngine.cpp
GameEngine::GameEngine(HINSTANCE hInstance, LPTSTR szTitle, int iWidth, int iHeight)
{
m_pEngine = this;
m_hInstance = hInstance;
m_hWnd = NULL;
m_szTitle = szTitle;
m_iWidth = iWidth;
m_iHeight = iHeight;
m_iFrameDelay = 50;
}
Vysvetleni :
GameEngine.h - to je cast te tridy
GameEngine.cpp - to je cast konstruktoru tridy, kde mi to hlasi ten link error, radek 3,
m_pEngine = this
Tak co, kdyztak sem dam dalsi kod, kdybi bilo treba (jakoze asi bude)
Dik za pomoc
Jura: ale ne :D Z té hlášky jsem pouze vydedukoval že jde o ten engine, a protože ten engine znám a v Devku jsem ho zprovoznil, píšu co je třea udělat.
max: co by podle tebe měl dělat ten řádek m_pEngine = this ??
Ten radek sem sem skopiroval omilem, chtel sem skopirovar cast funkce WinMain v souboru GameEnigne.cpp
To tucna:co mam teda udelat
Tohle je vyrez funkce WinMain v souboru GameEngine.cpp pro juru
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
MSG msg;
static int iTickTrigger = 0;
int iTickCount;
if(Init(hInstance))
{
if (!GameEngine::GetMyEngine()->Initialize(iCmdShow))
Hlasi to link error k tomu poslednimu radku ve vyrezu WinMain a si k ty inicializaci m_pGameEngine viz vise
PS: jak mam inicializovat ten ukazatel
A proč to teda neuděláš přesně podle té knihy? :)
Pisni prosím ještě jaký error ti to teď píše
No musel sem to trochu upravit pro sebe
Link error
Takhle je to napsany v zalozce Kompilator
C:\Documents and Settings\403783\Plocha\RPG\GameEngine.o(.text+0x143) In function `ZN10GameEngineC2EP11HINSTANCE(char *, int, int)':
[Linker error] undefined reference to `GameEngine::m_pEngine'
C:\Documents and Settings\403783\Plocha\RPG\GameEngine.o(.text+0x191) In function `ZN10GameEngineC1EP11HINSTANCE(char *, int, int)':
[Linker error] undefined reference to `GameEngine::m_pEngine'
C:\Documents and Settings\403783\Plocha\RPG\GameEngine.o(.text$_ZN10GameEngine11GetMyEngineEv[GameEngine::GetMyEngine()]+0xe) In function `WinMain': [Linker error] undefined reference to `GameEngine::m_pEngine'
Nechybí ti náhodou v souboru GameEngine.cpp - GameEngine *GameEngine::m_pGameEngine = NULL; ?
Můžeš kdyžtak popsat změny které jsi v tom enginu udělal?
A mimochodem - používáš "Překompilovat vše" a ne jen "Překompilovat" ?
Hned pod include
//-----------------------------------------------------------------
// Game Engine Object
// C++ Source - GameEngine.cpp
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------
#include "GameEngine.h"
//-----------------------------------------------------------------
// Static Variable Initialization
//-----------------------------------------------------------------
GameEngine *GameEngine::m_pEngine = NULL;
//-----------------------------------------------------------------
// Windows Functions
//-----------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
To znamená, že to spadne ještě před zavoláním CreateWindow(Ex). Pokud umíš pracovat s debuggerem, tak by neměl být problém nalézt místo, kde to padá. V případě, že s ním pracovat neumíš, tak ti doporučuju rychle to změnit. Ale abych předešel zbytečným otazkám, jako krizové východisko z téhle situace vidím použití kontrolních výpisů(MessageBox a zpráva). Vlož je do každé podmínky ve WinMain. A trasuj si cestu kudy program jde, tím snad zjistíš, kde ti program padá a v čem je problém.
Jeste se chci zeptat, protoze to vypada ze ten Ebgib budu muset celej predelat, jestli by se cykly nedali resit misto tou divnou smyckou Timerem, tedy casovacem
A pokud myslite ze jo, tak kolik mam nastavit to posilani zpravy timeru, aby posilal 20 za vterinu
Diky
SetTimer(hwnd_okna, 1, 50, NULL);//1000/20=50
??Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
LINK : fatal error LNK1104: cannot open file 'libmysql.lib' — založil Zuben
QT error: Error code 62097 — založil QtProgramming
Zaujimavy link... — založil Programmer ;)
Validný link? — založil Thomash
Mizící link — založil Zelenáč
Moderátoři diskuze