Problem s linkerom

asd

Problem s linkerom
« kdy: 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/), 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/).

Kód: [Vybrat]
...
#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
Kód: [Vybrat]
-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:
Kód: [Vybrat]
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) je poradie linkovanych kniznic spravne.

Predom dakujem za odpovede


asd

Re: Problem s linkerom
« Odpověď #1 kdy: 10. 04. 2011, 14:14:20 »
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.

Re: Problem s linkerom
« Odpověď #2 kdy: 10. 04. 2011, 15:39:40 »
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)

asd

Re: Problem s linkerom
« Odpověď #3 kdy: 10. 04. 2011, 15:55:38 »
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
Kód: [Vybrat]
-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)
Kód: [Vybrat]
/usr/bin/c++   -O3 -DNDEBUG   CMakeFiles/AppHelloWorld.dir/HelloWorld.o  -o AppHelloWorld -rdynamic ../../libs/libBulletDynamics.a ../../libs/libBulletCollision.a ../../libs/libLinearMath.a
moja app:
Kód: [Vybrat]
/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)

asd

Re: Problem s linkerom
« Odpověď #4 kdy: 10. 04. 2011, 16:32:22 »
A ked tam dam napr
Kód: [Vybrat]
-I/usr/local/include/BULLET /usr/local/lib/libBulletDynamics.a /usr/local/lib/libBulletCollision.a /usr/local/lib/libLinearMath.a
tak vypise:
Kód: [Vybrat]
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
Kód: [Vybrat]
-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


asd

Re: Problem s linkerom
« Odpověď #5 kdy: 10. 04. 2011, 17:18:37 »
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:
Kód: [Vybrat]
/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

Kód: [Vybrat]
/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

asd

Re: Problem s linkerom
« Odpověď #6 kdy: 10. 04. 2011, 17:28:58 »
Tak nic...teraz znova pise

Kód: [Vybrat]
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

Re: Problem s linkerom
« Odpověď #7 kdy: 10. 04. 2011, 17:43:57 »
Tak nic...teraz znova pise

Kód: [Vybrat]
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?)
« Poslední změna: 10. 04. 2011, 17:49:16 od hawran diskuse »

asd

Re: Problem s linkerom
« Odpověď #8 kdy: 10. 04. 2011, 17:51:21 »
Nakoniec po skompilovani hello world app bez dalsich uprav program funguje (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

asd

Re: Problem s linkerom
« Odpověď #9 kdy: 10. 04. 2011, 17:53:49 »
a ten vystup kompilacie:

Kód: [Vybrat]

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

Re: Problem s linkerom
« Odpověď #10 kdy: 11. 04. 2011, 10:31:52 »
a ten vystup kompilacie:

Kód: [Vybrat]

-------------- 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?

Ivan

Re: Problem s linkerom
« Odpověď #11 kdy: 11. 04. 2011, 10:58:06 »
pokud pouzivas CMAKE a mas nejaky problem tak kompiluj s verbose

make <target> VERBOSE=1
nebo jen
make VERBOSE=1

asd

Re: Problem s linkerom
« Odpověď #12 kdy: 11. 04. 2011, 11:29:23 »
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
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:
Kód: [Vybrat]
/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 :)