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.
Kokeile näitä:
A: -lSDL2
→ -lSDL2.dll
B: -lwinmm
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ä!
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.