Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: asd 10. 04. 2011, 13:06:56
-
Caute,
mam problem (resp. neviem ako) s linkovanim. Stiahol som si Bullet physics engine 1.78 (http://bulletphysics.org/wordpress/ (http://bulletphysics.org/wordpress/)), skompiloval a vsetko bolo vporiadku, taktiez aj dema fungovali (az na to ze pri soft body demach meshe bolo mozne vidiet len pri wireframe mode). Potom som si chcel vytvorit nejaky maly program ktory by pouzival bullet a ogre (http://ogre3d.org/ (http://ogre3d.org/)).
...
#include <BULLET/btBulletDynamicsCommon.h>
...
v dalsom kode som okrem tejto inkludacie s bulletom nic nerobil
pouzivam cmake a CMAKE_CXX_FLAGS som si nastavil na
-I/usr/local/include/BULLET -L/usr/local/lib -lBulletDynamics -lBulletCollision -lLinearMath
jednotlive kniznice su archivy s priponou .a (teda file libBulletDynamics.a hovori libBulletDynamics.a: current ar archive)
avsak, pri kompilacii mi vypisalo tuto chybu:
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o||In function `btAlignedAllocator<int, 16u>::deallocate(int*)':|
/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|undefined reference to `btAlignedFreeInternal(void*)'|
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o||In function `btAlignedAllocator<btTriangleInfo, 16u>::deallocate(btTriangleInfo*)':|
/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|undefined reference to `btAlignedFreeInternal(void*)'|
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o||In function `btAlignedAllocator<btHashInt, 16u>::deallocate(btHashInt*)':|
/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|undefined reference to `btAlignedFreeInternal(void*)'|
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o||In function `btAlignedAllocator<int, 16u>::deallocate(int*)':|
/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|undefined reference to `btAlignedFreeInternal(void*)'|
/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|undefined reference to `btAlignedFreeInternal(void*)'|
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o:/usr/local/include/BULLET/LinearMath/btAlignedAllocator.h|90|more undefined references to `btAlignedFreeInternal(void*)' follow|
CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o:(.rodata._ZTV17btTypedConstraint[vtable for btTypedConstraint]+0x60)||undefined reference to `btTypedConstraint::serialize(void*, btSerializer*) const'|
||=== Build finished: 7 errors, 0 warnings ===|
v subore /usr/local/include/BULLET/LinearMath/btAlignedAllocator.h je samozrejme len prototyp funkcie btAlignedFreeInternal(void *) a pravdepodobne v libLinearMath.a je jej implementacia, ktoru nevie najst lebo ocividne tie kniznice nejako zle linkujem. Podla bulletovskej wiki (http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch#Unix.2C_Linux.2C_MinGW_etc (http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch#Unix.2C_Linux.2C_MinGW_etc)) je poradie linkovanych kniznic spravne.
Predom dakujem za odpovede
-
Taktiez som sa docital ze .a archivy su staticky linkovane kniznice a ze by sa mali linkovat tak, ze napisem absolutnu cestu ku suboru ale ani to nepomohlo. Nepomohlo ani poprehadzovat poradie kniznic.
-
Takhle na dálku se těžko něco radí, ale když se podívám na tu wiki, tak tam vidím, že ty knihovny jsou každá ve svém adresáři
./bullet/BulletDynamics/ - libBulletDynamics.a
./bullet/BulletCollision/ - libBulletCollision.a
./bullet/LinearMath/ - libLinearMath.a
Takže bych čekal něco jako
... -L.../bullet/BulletDynamics -lBulletDynamics -L.../bullet/BulletCollision -lBulletCollision -L .../bullet/LinearMath -lLinearMath
kde místo .../bullet bude plná cesta k /bullet
(a ty volby pro ten linker by se měly objevit na konci voleb)
-
no pri make install sa tie kniznice sami nenakopirovali takze som ich dal vsetky do /usr/local/lib (cize ziadne podpriecinky)
takze som CMAKE_CXX_FLAGS nastavil ako si poradil
-I/usr/local/include/BULLET -L/usr/local/lib -lBulletDynamics -L/usr/local/lib -lBulletCollision -L/usr/local/lib -lLinearMath
ale stale s tym istym vysledkom
ak by to nieco pomohlo: pozeral som aj ako linkuje demo aplikacie bulletu (napr. subor HelloWorld/CMakeFiles/AppHelloWorld.dir/link.txt)
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/AppHelloWorld.dir/HelloWorld.o -o AppHelloWorld -rdynamic ../../libs/libBulletDynamics.a ../../libs/libBulletCollision.a ../../libs/libLinearMath.a
moja app:
/usr/bin/c++ -I/usr/local/include/BULLET -L/usr/local/lib -lBulletDynamics -L/usr/local/lib -lBulletCollision -L/usr/local/lib -lLinearMath -O2 -g CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o -o dist/bin/OgreApp -rdynamic /usr/local/lib/libOgreMain.so -lboost_thread-mt -lboost_date_time-mt /usr/local/lib/libOIS.so -Wl,-rpath,/usr/local/lib:
(podla tvojho prikladu...a inac toto su prikazy generovane cmake-om - taktiez subor link.txt)
-
A ked tam dam napr
-I/usr/local/include/BULLET /usr/local/lib/libBulletDynamics.a /usr/local/lib/libBulletCollision.a /usr/local/lib/libLinearMath.a
tak vypise:
Using makefile: Makefile
[100%]
Building CXX object CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o
c++: /usr/local/lib/libBulletDynamics.a: linker input file unused because linking not done
c++: /usr/local/lib/libBulletCollision.a: linker input file unused because linking not done
c++: /usr/local/lib/libLinearMath.a: linker input file unused because linking not done
Linking CXX executable dist/bin/OgreApp
[100%] Built target OgreApp
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 0 warnings
ale ked ako CMAKE_CFF_CFLAGS nastavim
-I/usr/local/include/BULLET -lBulletDynamics -lBulletCollision -lLinearMath
tak to skompiluje bez akychkolvek pripomienok...takze teoreticky by to malo byt polinkovane ale akonahle odkomentujem tu inkludaciu (#include <BULLET/btBulletDynamicsCommon.h>) a dam kompilovat, znova vypise tie chyby
-
omg krista boha...cely den googlim a hladam kde som spravil chybu a nakoniec je chyba v cmake (alebo som to zle pouzil)...nespravne poradie parametrov v builde
zmenil som toto:
/usr/bin/c++ -I/usr/local/include/BULLET -lBulletDynamics -lBulletCollision -lLinearMath -O2 -g CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o -o dist/bin/OgreApp -rdynamic /usr/local/lib/libOgreMain.so -lboost_thread-mt -lboost_date_time-mt /usr/local/lib/libOIS.so -Wl,-rpath,/usr/local/lib:
na
/usr/bin/c++ -O2 -g CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o -o dist/bin/OgreApp -I/usr/local/include/BULLET -lBulletDynamics -lBulletCollision -lLinearMath -rdynamic /usr/local/lib/libOgreMain.so -lboost_thread-mt -lboost_date_time-mt /usr/local/lib/libOIS.so -Wl,-rpath,/usr/local/lib:
cize som musel vsetko rucne prehadzat za output parameter v subore link.txt
-
Tak nic...teraz znova pise
c++: /usr/local/lib/libBulletDynamics.a: linker input file unused because linking not done
c++: /usr/local/lib/libBulletCollision.a: linker input file unused because linking not done
c++: /usr/local/lib/libLinearMath.a: linker input file unused because linking not done
aj ked uz bez toho erroru (ze nenaslo definiciu funkcie...), tak plz ak by niekto vedel co s tym
-
Tak nic...teraz znova pise
c++: /usr/local/lib/libBulletDynamics.a: linker input file unused because linking not done
c++: /usr/local/lib/libBulletCollision.a: linker input file unused because linking not done
c++: /usr/local/lib/libLinearMath.a: linker input file unused because linking not done
aj ked uz bez toho erroru (ze nenaslo definiciu funkcie...), tak plz ak by niekto vedel co s tym
Tohle jsem viděl většinou když byl špatně sestavený příkaz pro překlad/linkování. Prostě Ti to napsalo, že provedl, co jsi po něm chtěl a k žádnému linkování už nedošlo.
Mohl bys sem dát celý výstup z kompilace? (předpokládám, že se tam vypisují příkazy s parametry, jak se volají z makefile)
BTW, co je to za systém? (Distro?)
-
Nakoniec po skompilovani hello world app bez dalsich uprav program funguje (http://ugweb.cs.ualberta.ca/~rod/tutorials/error_messagesC.html#Compiler_Flags (http://ugweb.cs.ualberta.ca/~rod/tutorials/error_messagesC.html#Compiler_Flags) - rozumiem tomu len neviem ako teda tomu zabranit) ale aj tak by som bol radsej keby mi to tam nevypisovalo. Uz to tu nebudem spamovat, takze ak by niekto vedel ako to napravit tak plz napiste/ja napisem ak zistim.
hawran diskuse: Debian Wheezy
-
a ten vystup kompilacie:
-------------- Build: OgreApp in OgreApp ---------------
Using makefile: Makefile
Scanning dependencies of target OgreApp
[100%]
Building CXX object CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o
c++: /usr/local/lib/libBulletDynamics.a: linker input file unused because linking not done
c++: /usr/local/lib/libBulletCollision.a: linker input file unused because linking not done
c++: /usr/local/lib/libLinearMath.a: linker input file unused because linking not done
Linking CXX executable dist/bin/OgreApp
[100%] Built target OgreApp
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings
-
a ten vystup kompilacie:
-------------- Build: OgreApp in OgreApp ---------------
Using makefile: Makefile
Scanning dependencies of target OgreApp
[100%]
Building CXX object CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o
c++: /usr/local/lib/libBulletDynamics.a: linker input file unused because linking not done
c++: /usr/local/lib/libBulletCollision.a: linker input file unused because linking not done
c++: /usr/local/lib/libLinearMath.a: linker input file unused because linking not done
Linking CXX executable dist/bin/OgreApp
[100%] Built target OgreApp
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings
Hm.
Zřejmě je potlačeno echování příkazů, které se mají vykonávat.
Pokud to chceš ještě dál řešit, můžeš to nějak zapnout?
-
pokud pouzivas CMAKE a mas nejaky problem tak kompiluj s verbose
make <target> VERBOSE=1
nebo jen
make VERBOSE=1
-
Konecne problem vyrieseny (este pred tym ako Ivan poradil verbose...skoda mozno ze by som to uz mal vcera:D). Neviem preco cmake pouziva 2 podla mna skoro identicke subory ale tak asi nejaky dovod na to mali. No takze v zlozke APLIKACIA.dir su okrem inych 2 subory: link.txt a flags.txt a ja som si ten flags.txt vsimol az teraz a v nom bol problem. Ako pisal hawran diskuse, chyba bola koli zle zostavenom buildovacom prikaze. Mal som tam:
CXX_FLAGS = -I/usr/local/include/BULLET -rdynamic /usr/local/lib/libBulletDynamics.a /usr/local/lib/libBulletCollision.a /usr/local/lib/libLinearMath.a -O2 -g -I/usr/local/include/OIS -I/usr/local/include -I/usr/local/include/OGRE -I/usr/local/share/OGRE/samples/Common/include
CXX_DEFINES = -DBOOST_ALL_NO_LIB
a tam sa mi nejako zatulal prepinac -rdynamic...takze som to len pomenil na:
CXX_FLAGS = -O2 -g -I/usr/local/include/BULLET -lBulletDynamics -lBulletCollision -lLinearMath -I/usr/local/include/OIS -I/usr/local/include -I/usr/local/include/OGRE -I/usr/local/share/OGRE/samples/Common/include
CXX_DEFINES = -DBOOST_ALL_NO_LIB
a aby to bolo konzistentne, dal som do rovnakeho tvaru aj link.txt:
/usr/bin/c++ -O2 -g CMakeFiles/OgreApp.dir/TutorialApplication.cpp.o -o dist/bin/OgreApp -I/usr/local/include/BULLET -lBulletDynamics -lBulletCollision -lLinearMath -rdynamic /usr/local/lib/libOgreMain.so -lboost_thread-mt -lboost_date_time-mt /usr/local/lib/libOIS.so -Wl,-rpath,/usr/local/lib:
a hotovo...Obidvom dakujem :)