Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL2: Linkkerivirhe: __imp_timeGetTime ym.

Eki++ [18.01.2014 14:20:33]

#

Aloitin tuossa muutama päivä sitten jonkinmoisen pelin teon. Kuitenkin kääntäessä linkkeri heittää 13 erroria:

linkkeri kirjoitti:

c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-mingw32/lib/../lib/libSDL2.a(SDL_systimer.o):SDL_systimer.c:(.text+0x63): undefined reference to `__imp_timeBeginPeriod'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-mingw32/lib/../lib/libSDL2.a(SDL_systimer.o):SDL_systimer.c:(.text+0x73): undefined reference to `__imp_timeEndPeriod'
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-mingw32/lib/../lib/libSDL2.a(SDL_systimer.o):SDL_systimer.c:(.text+0xdf): undefined reference to `__imp_timeGetTime'
– –
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.8.2/../../../../x86_64-w64-mingw32/lib/../lib/libSDL2.a(SDL_systimer.o): bad reloc address 0x0 in section `.pdata'
collect2.exe: error: ld returned 1 exit status

Käännöskomento:

g++ main.cpp game.cpp helpfuncs.cpp menu.cpp world.cpp -o peli.exe -lSDL2main -lSDL2 -lopengl32 -lglu32 -O

Ymmärsin tuosta sen verran, että se liittyy SDL:n ajastimeen. Pelin pääfunktiossa käytetään sitä:

bool running = true;
int f_b = 0, l_r = 0;
Uint32 oldTime, currentTime = SDL_GetTicks();
float deltaTime;
Player *p = new Player;
// ...
while(running) {
	oldTime = currentTime;
	currentTime = SDL_GetTicks();
	deltaTime = (currentTime - oldTime) / 1000.0f;
    // ...
	p->move(f_b * deltaTime, l_r * deltaTime, 0);
	// ...
}

Koko koodia en tähän liitä, koska sen pituus on rapiat viisi ja puoli sataa riviä (ilman kommentteja). Yritin googlettaa, mutta joko koko internetistä ei löydy mitään apua asiaan (o_0) tai sitten en vain osaa.

Metabolix [18.01.2014 14:42:56]

#

Kokeile näitä:
A: -lSDL2-lSDL2.dll
B: -lwinmm

Eki++ [18.01.2014 16:46:59]

#

Kirjastohakemistossa ei ollut SDL2.dll.a-tiedostoa, joten kohta 1 ei toiminut.

Sen sijaan -lwinmm antoi poisti vanhat mutta antoi uusia erroreita: – – __imp_CreateDCW, __imp_SetDeviceGammaRamp, __imp_DeleteDC...

Mod. huom: tiivistä!

Metabolix [18.01.2014 16:50:11]

#

Jos vikana on funktio __imp_foo, googleta MSDN foo ja katso MSDN:stä, missä kirjastossa funktio on, ja lisää sopiva parametri. Esimerkiksi DeleteDC on kirjastossa gdi32, joten tarvitset parametrin -lgdi32.

Sinänsä kyllä SDL:n pitäisi toimia suoraan, kunhan se vain linkitetään dynaamisesti, ja siihen ilmeisesti tarvitaan libSDL2.dll.a tai vastaava. Kannattanee etsiä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta