Iltapäivää.
Olen jo aivan liian pitkään kamppaillut Irrlicht Enginen linkittämisen kanssa. Saan seuraavanlaisen virheilmoituksen:
g++:n linkkeri kirjoitti:
...
(polku)/main.cpp:28: undefined reference to `__imp_createDevice'
collect2.exe: error: ld returned 1 exit status
Erikoista on, että linkkeri löytää kaikkien muiden funktioiden määrittelyt, koska kommentoidessani createDevice
:n pois linkitys onnistui. Koodini:
#include <irrlicht.h> int main() { irr::IrrlichtDevice *device = irr::createDevice(); // Kaikki muut alustukset while(device->run()) { driver->beginScene(); smgr->drawAll(); guienv->drawAll(); driver->endScene(); } device->drop(); }
Käännöskomento (käytän Code::Blocks):
g++ käskyt kirjoitti:
g++.exe -o "(Path)\Test.exe" "(Path)\Test\main.o"
..\..\..\..\..\..\MinGW\lib\libIrrlicht.a
Kokeilin kaikkia mahdollisia kirjastotiedostoja mitkä tulivat zipin mukana, staattista linkitystä (_IRR_STATIC_LIB_
ja IRRLICHT_EXPORTS
) ja koko kirjaston uudelleen kääntämistä. Kaikki näistä antoivat tuon saman virheen. Olen googlesta hakenut ja kysynyt SO:ssa ja GameDevissä. Viimeisenä nakkina kokeilin kirjaston lähdekoodin liittämistä projektiin. Se loi semmoisen rysäyksen erroreita, että meni hermot ja ajattelin kysyä täältä. Ihan vaan btw, osa niistä viimeisistä virheistä:
linkkeri kirjoitti:
- -
In function `irr::CIrrDeviceWin32::TextureToCursor(HWND__*, irr::video::ITexture*, irr::core::rect<int> const&, irr::core::vector2d<int> const&)':
(polku)/CIrrDeviceWin32.cpp:1865: undefined reference to `__imp_CreateCompatibleDC'
(polku)/CIrrDeviceWin32.cpp:1866: undefined reference to `__imp_CreateCompatibleDC'
(polku)/CIrrDeviceWin32.cpp:1867: undefined reference to `__imp_CreateCompatibleBitmap'
(polku)/CIrrDeviceWin32.cpp:1868: undefined reference to `__imp_CreateCompatibleBitmap'
(polku)/CIrrDeviceWin32.cpp:1870: undefined reference to `__imp_SelectObject'
- -
In function `irr::video::COpenGLDriver::genericDriverInit()':
(polku)/COpenGLDriver.cpp:662: undefined reference to `__imp_glGetString'
(polku)/COpenGLDriver.cpp:669: undefined reference to `__imp_glGetString'
(polku)/COpenGLDriver.cpp:670: undefined reference to `__imp_glGetString'
(polku)/COpenGLDriver.cpp:705: undefined reference to `__imp_glPixelStorei'
- -
Kun ei nyt vaan haluaisi rueta MSDN:ää kahlaamaan. Jos joku tietäisi ratkaisun, niin arvostaisin sitä suuresti.
Eka virheilmoitus näyttäisi johtuvan siitä ettet linkkaa Irrlicht-kirjastoa mukaan (tai sitten käytät kirjaston väärää versiota). Kokeileppa kääntää ihan vain komennolla:
g++.exe main.c -o Test.exe -lIrrlicht
Eki++ kirjoitti:
..\..\..\..\..\..\MinGW\lib\libIrrlicht.a
Hyi kauhistus. Linkittämiseen käytetään -l
-parametreja kuten -lIrrlicht
.
Eki++ kirjoitti:
Erikoista on, että linkkeri löytää kaikkien muiden funktioiden määrittelyt,
Irrlichtin luokkien jäsenfunktiot ovat virtuaalisia, jolloin ohjelman ei tarvitse tietää niiden määrittelyjä tai osoitteita vaan funktioiden osoitteet sisältyvät olioon itseensä. Toisin sanoen koodissasi ei ole suoraa viittausta mihinkään muuhun funktioon kuin irr::createDevice.
Eki++ kirjoitti:
Kun ei nyt vaan haluaisi rueta MSDN:ää kahlaamaan.
Mitähän edes ajattelit löytäväsi MSDN:stä, kun käännösprosessisi ei koske sen paremmin Microsoftin kääntäjää kuin Microsoftin kirjastojakaan?
Metabolix kirjoitti:
Eki++ kirjoitti:
..\..\..\..\..\..\MinGW\lib\libIrrlicht.a
Hyi kauhistus. Linkittämiseen käytetään
-l
-parametreja kuten-lIrrlicht
.
Tuolta se näytti kun laitoin Code::Blocks:ssa Project -> Build Settings... -> Linker settings -> Link libraries ja siihen polun Irrlichtin kirjastofiluun.
Metabolix kirjoitti:
Eki++ kirjoitti:
Kun ei nyt vaan haluaisi rueta MSDN:ää kahlaamaan.
Mitähän edes ajattelit löytäväsi MSDN:stä, kun käännösprosessisi ei koske sen paremmin Microsoftin kääntäjää kuin Microsoftin kirjastojakaan?
Tässä threadissa kerroit minulle, että noissa __imp_foo
tapauksissa katso MSDN:stä missä kirjastossa kyseinen funkkari sijaitsee.
Eki++ kirjoitti:
Tuolta se näytti kun laitoin Code::Blocks:ssa Project -> Build Settings... -> Linker settings -> Link libraries ja siihen polun Irrlichtin kirjastofiluun.
Niin, sitä en lainkaan epäile. Kuitenkin siis olet hakenut jonkin tiedoston suhteellisen polun, vaikka sinun pitäisi lisätä vain oikea linkitysparametri.
Sisältääkö lataamasi paketti ehkä erikseen dynaamisesti ja staattisesti linkitettävät versiot kirjastosta? Tässä tapauksessa tarvitset dynaamisesti linkitettävää versiota.
Eki++ kirjoitti:
Tässä threadissa kerroit minulle, että noissa
__imp_foo
tapauksissa katso MSDN:stä missä kirjastossa kyseinen funkkari sijaitsee.
Hienoa, että yleistät ohjeita, mutta nyt yleistys meni ehkä yli. Viimeksi yritit linkittää SDL2-ohjelmaa ja virheistä näki suoraan, että ne tulevat WinAPI-funktioista. Nyt taas esimerkiksi __imp_createDevice ilmiselvästi viittaa Irrlichtin funktioon, josta ei tietenkään löydy tietoa MSDN:stä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.