Linker errors with COLLADA + CodeBlocks

Post Reply
Kukanani
Posts: 25
Joined: Sat Feb 21, 2009 5:08 am

Linker errors with COLLADA + CodeBlocks

Post by Kukanani »

Hi all,

I'm using Bullet with Code::Blocks. I know that you can't use the MSVC projects for this, so I tried to make new projects myself. I have the core Bullet libraries working, but now I'm tackling COLLADA and I get linker errors.

First I made two projects: Library_BulletCollada and Library_ColladaDOM. Added Extras/BulletColladaConverter/ files to BulletCollada, added the Extras/COLLADA_DOM files to ColladaDOM. Built both libraries fine.

Then I made a made a new project using all the same build options as Demos/ColladaDemo. I added my two libraries to the link libraries.

Then I hit link time....
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xeb5)||undefined reference to `_COLLADA_ELEMENT_LIBRARY_GEOMETRIES'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xec1)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xecc)||undefined reference to `domLibrary_geometries::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xfc9)||undefined reference to `_COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xfd2)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xfdb)||undefined reference to `_COLLADA_ELEMENT_VISUAL_SCENE'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xfe4)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0xfef)||undefined reference to `domVisual_scene::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x100d)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x102e)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10b9)||undefined reference to `_COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10c2)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10cb)||undefined reference to `_COLLADA_ELEMENT_PHYSICS_SCENE'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10d4)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10df)||undefined reference to `domPhysics_scene::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x10fd)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x111e)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x11f9)||undefined reference to `daeURI::getURI() const'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1231)||undefined reference to `_COLLADA_ELEMENT_INSTANCE_PHYSICS_MODEL'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x124a)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x125f)||undefined reference to `domInstance_physics_model::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x128d)||undefined reference to `daeURI::daeURI(char const*, bool)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x12ae)||undefined reference to `daeURI::getOriginalURI() const'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x12c0)||undefined reference to `daeURI::setURI(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x12ec)||undefined reference to `daeElement::release() const'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1333)||undefined reference to `daeURI::~daeURI()'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x137a)||undefined reference to `daeURI::~daeURI()'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x13f7)||undefined reference to `_COLLADA_ELEMENT_INSTANCE_RIGID_CONSTRAINT'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1400)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1414)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x151d)||undefined reference to `_COLLADA_ELEMENT_PHYSICS_MODEL'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1526)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1531)||undefined reference to `domPhysics_model::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x154f)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1570)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1598)||undefined reference to `_COLLADA_ELEMENT_LIBRARY_PHYSICS_MODELS'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x15aa)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x167f)||undefined reference to `_COLLADA_ELEMENT_LIBRARY_PHYSICS_MATERIALS'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1694)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x169f)||undefined reference to `domLibrary_physics_materials::_Meta'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x16bf)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1740)||undefined reference to `_COLLADA_ELEMENT_PHYSICS_MATERIAL'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x174f)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x1784)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17a4)||undefined reference to `daeStringRef::operator=(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17ba)||undefined reference to `_COLLADA_ELEMENT_TECHNIQUE_COMMON'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17c6)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17cd)||undefined reference to `_COLLADA_ELEMENT_DYNAMIC_FRICTION'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17d9)||undefined reference to `daeElement::createAndPlace(char const*)'|
..\..\lib\Library_Collada.a(ColladaConverter.o):ColladaConverter.cpp:(.text+0x17e7)||undefined reference to `_COLLADA_ELEMENT_STATIC_FRICTION'|
||More errors follow but not being shown.|
||Edit the max errors limit in compiler options...|
||=== Build finished: 50 errors, 0 warnings ===|
Kukanani
Posts: 25
Joined: Sat Feb 21, 2009 5:08 am

Re: Linker errors with COLLADA + CodeBlocks

Post by Kukanani »

I forgot to build the LibXML library.

Now I'm down to two errors:
..\..\lib\Library_ColladaDOM.a(daeLIBXMLPlugin.o):daeLIBXMLPlugin.cpp:(.text+0x5a5)||undefined reference to `__imp__xmlFree'|
..\..\lib\Library_ColladaDOM.a(daeLIBXMLPlugin.o):daeLIBXMLPlugin.cpp:(.text+0x759)||undefined reference to `__imp__xmlFree'|
||=== Build finished: 2 errors, 0 warnings ===|
Any ideas?
User avatar
Erwin Coumans
Site Admin
Posts: 4221
Joined: Sun Jun 26, 2005 6:43 pm
Location: California, USA
Contact:

Re: Linker errors with COLLADA + CodeBlocks

Post by Erwin Coumans »

No idea why the linker can't find the xmlFree.

A workaround is to comment out the lines referring to 'xmlFree' in Bullet/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp around line 380 and 430. You introduce a memory leak during COLLADA/XML processing, but at least things will compile/build and run.

Note that you can autogenerate CodeBlocks projectfiles using CMake:
  • Install CodeBlocks with MinGW support, in default location this it c:\program files\codeblocks
  • Install latest CMake 2.6
    Now you have to make sure that cmake can find a version of make, such as mingw32-make.exe:
  • Install full version of MinGW in c:\program files\codeblocks\mingw
  • Add c:\program files\codeblocks\mingw\bin to the path (right-click on My Computer, Advanced, Environment Variables, add to PATH variable)
  • Now open a console (Start, run cmd, and verify that mingw32-make is in the path)
  • Change directory to Bullet and run

    Code: Select all

    cmake . -G "CodeBlocks - MinGW Makefiles"
    
  • Open CodeBlocks IDE and open Bullet/BULLET_PHYSICS.cbp
Note that there are 2 build issues for CodeBlocks with Bullet 2.74: the one you pointed out about xmlFree, and there is a typo in one of the CMakeList.txt files: Bullet\Demos\ForkliftDemo\CMakeList.txt line 55 should be ${OPENGL_glu_LIBRARY} and not ${OPENGL_glU_LIBRARY}. Both issues will be fixed in Bullet 2.75.

Hope this helps,
Erwin
Kukanani
Posts: 25
Joined: Sat Feb 21, 2009 5:08 am

Re: Linker errors with COLLADA + CodeBlocks

Post by Kukanani »

Thanks!

For now I just surrounded the xmlFree lines with pre-processor directives and made a define on compile so I won't have to go back and manually un-comment those lines when the time comes.

I tried using CMake, but I found it easier to just make my own project files.

Kukanani
debio264
Posts: 5
Joined: Wed Sep 09, 2009 5:52 pm

Re: Linker errors with COLLADA + CodeBlocks

Post by debio264 »

I'm trying to build Bullet on Windows with MinGW as well, and I've used CMake to generate MinGW Makefiles. When building, I get the same linker errors as the first post in BulletColladaConverter.
What's not getting linked and why does the same CMake system work on Linux? I'm poking around to try and figure out what's different.

Update: Well, the CMakeLists.txt in BulletColladaConverter says that ColladaDom should be linked in, but something weird is definitely going on. Here's the relevant output:

Code: Select all

c:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x2b5): undefined reference to `COLLADA_ELEMENT_LIBRARY_GEOMETRIES'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x2c1): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x2cc): undefined reference to `domLibrary_geometries::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x344): undefined reference to `COLLADA_ELEMENT_LIBRARY_GEOMETRIES'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x356): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x360): undefined reference to `domLibrary_geometries::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x3f8): undefined reference to `COLLADA_ELEMENT_LIBRARY_PHYSICS_MATERIALS'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x40d): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x417): undefined reference to `domLibrary_physics_materials::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x434): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x51b): undefined reference to `COLLADA_ELEMENT_PHYSICS_MODEL'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x524): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x52e): undefined reference to `domPhysics_model::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x551): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x569): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x58b): undefined reference to `COLLADA_ELEMENT_LIBRARY_PHYSICS_MODELS'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x59d): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x614): undefined reference to `COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x61d): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x626): undefined reference to `COLLADA_ELEMENT_PHYSICS_SCENE'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x62f): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x639): undefined reference to `domPhysics_scene::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x659): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x673): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x72b): undefined reference to `daeURI::getURI() const'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x764): undefined reference to `COLLADA_ELEMENT_INSTANCE_PHYSICS_MODEL'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x77d): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x787): undefined reference to `domInstance_physics_model::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x7bd): undefined reference to `daeURI::daeURI(char const*, bool)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x7de): undefined reference to `daeURI::getOriginalURI() const'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x7f0): undefined reference to `daeURI::setURI(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x82b): undefined reference to `daeElement::release() const'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x866): undefined reference to `daeURI::~daeURI()'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x8d1): undefined reference to `daeURI::~daeURI()'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x9d4): undefined reference to `COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x9dd): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x9e6): undefined reference to `COLLADA_ELEMENT_VISUAL_SCENE'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x9ef): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0x9f9): undefined reference to `domVisual_scene::_Meta'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xa19): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xa33): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xaf7): undefined reference to `COLLADA_ELEMENT_INSTANCE_RIGID_CONSTRAINT'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xb00): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xb14): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xb6f): undefined reference to `COLLADA_ELEMENT_PHYSICS_MATERIAL'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xb7d): undefined reference to `daeElement::createAndPlace(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xbb3): undefined reference to `daeStringRef::operator=(char const*)'
CMakeFiles/BulletColladaConverter.dir/ColladaConverter.obj:ColladaConverter.cpp:(.text+0xbc9): undefined reference to `daeStringRef::operator=(char const*)'

...
(Errors cut because PhpBB thought my post was too long)
Now, if I could figure out how to get the arguments being passed to ld, I could probably make more sense of this...
It looks like ColladaDom is getting linked in, and if that's the case, then the missing symbols must've not been compiled into ColladaDom. Unless something even crazier is wrong.
I don't know a lot about CMake. I'll keep trying to figure out what's wrong, but any help would be appreciated.

Update Again:
Well, inside BulletColladaConverter/CMakeFiles/BulletColladaConverter.dir, link.txt says:

Code: Select all

C:\MinGW\bin\g++.exe    -shared -o libBulletColladaConverter.dll -Wl,--out-implib,libBulletColladaConverter.dll.a -Wl,--major-image-version,0,--minor-image-version,0 CMakeFiles\BulletColladaConverter.dir\ColladaConverter.obj ..\LibXML\libXML.dll.a ..\COLLADA_DOM\libColladaDom.dll.a ..\..\src\BulletCollision\libBulletCollision.dll.a ..\..\src\BulletDynamics\libBulletDynamics.dll.a ..\LibXML\libXML.dll.a ..\..\src\BulletCollision\libBulletCollision.dll.a ..\..\src\LinearMath\libLinearMath.dll.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 
This command, when run in a normal DOS prompt, gives the same linker errors. I don't see anything wrong with it, so I'm not sure how to procede.
Post Reply