Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Irrlicht linkittäminen (g++)

Eki++ [04.11.2014 16:57:10]

#

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.

Deffi [05.11.2014 11:55:59]

#

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

Metabolix [05.11.2014 14:58:27]

#

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?

Eki++ [05.11.2014 16:35:32]

#

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.

Metabolix [07.11.2014 15:04:55]

#

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ä.

Vastaus

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

Tietoa sivustosta