Problems compiling OgreODE

Bruno

28-09-2011 16:54:35

Hi, I've been having some trouble compiling OgreODE (I'm using Ubuntu 11.04). I downloaded and successfully compiled Ogre 1.7.3 and ODE 0.11.1, however whenever I try to compile OgreODE (the latest version from the ogreaddons svn), I get an error saying that I must recompile with -fPIC when it was linking to libODE.a. Anyway, I added -fPIC to $CXXFLAGS, ran ./configure && make clean && make in the directory I had previously compiled ODE in but alas, it made no difference whatsoever. I then tried various combinations of compiling different parts with -fPIC, trying to do it in different ways, etc for a couple of hours until I finally gave up.

Here's the output I got from make:
$ make -j3
[ 3%] [ 6%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxml.cpp.o
Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinystr.cpp.o
Scanning dependencies of target OgreOde_Core
[ 10%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeBody.cpp.o
[ 13%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxmlerror.cpp.o
[ 17%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxmlparser.cpp.o
[ 20%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeCollision.cpp.o
Linking CXX static library libtinyxml.a
[ 20%] Built target tinyxml
[ 24%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugContact.cpp.o
[ 27%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugObject.cpp.o
[ 31%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeEigenSolver.cpp.o
[ 34%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeEntityInformer.cpp.o
[ 37%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeGeometry.cpp.o
[ 41%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeJoint.cpp.o
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp: In member function ‘virtual void OgreOde::PistonJoint::setAxisDelta(const Ogre::Vector3&, const Ogre::Vector3&)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp:863:2: warning: ‘void dJointSetPistonAxisDelta(dxJoint*, dReal, dReal, dReal, dReal, dReal, dReal)’ is deprecated (declared at /usr/include/ode/objects.h:2057)
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp:864:74: warning: ‘void dJointSetPistonAxisDelta(dxJoint*, dReal, dReal, dReal, dReal, dReal, dReal)’ is deprecated (declared at /usr/include/ode/objects.h:2057)
[ 44%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeMaintainedList.cpp.o
[ 48%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeMass.cpp.o
[ 51%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdePrecompiledHeaders.cpp.o
[ 55%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeSpace.cpp.o
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp: In constructor ‘OgreOde::CapsuleMass::CapsuleMass(Ogre::Real, Ogre::Real, const Ogre::Vector3&, Ogre::Real)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:124:2: warning: ‘void dMassSetCappedCylinderTotal(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:85)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:124:80: warning: ‘void dMassSetCappedCylinderTotal(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:85)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp: In member function ‘void OgreOde::CapsuleMass::setDensity(Ogre::Real, Ogre::Real, const Ogre::Vector3&, Ogre::Real)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:135:2: warning: ‘void dMassSetCappedCylinder(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:84)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:135:78: warning: ‘void dMassSetCappedCylinder(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:84)
[ 58%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeStepper.cpp.o
[ 62%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshData.cpp.o
[ 65%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshDataManager.cpp.o
[ 68%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeUtility.cpp.o
[ 72%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeWorld.cpp.o
Linking CXX shared library ../lib/libOgreOde_Core.so
/usr/bin/ld: ../../ode/ode/src/.libs/libode.a(box.o): relocation R_X86_64_32S against `vtable for dxBox' can not be used when making a shared object; recompile with -fPIC
../../ode/ode/src/.libs/libode.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [lib/libOgreOde_Core.so.1.3.0] Error 1
make[1]: *** [Core/CMakeFiles/OgreOde_Core.dir/all] Error 2
make: *** [all] Error 2


Edit: I noticed that if I configure ODE with --with-pic I'm able to get further and it does compile libOgreOde_Core.so and libOgreOde_Prefab.so, however is still stops once it gets to libOgreOde_Prefab.so.1.3.0. Here's the output:
[ 3%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinystr.cpp.o
[ 6%]
Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxml.cpp.o
[ 10%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxmlerror.cpp.o
[ 13%] Building CXX object tinyxml/CMakeFiles/tinyxml.dir/tinyxmlparser.cpp.o
Linking CXX static library libtinyxml.a
/usr/bin/ar cr libtinyxml.a CMakeFiles/tinyxml.dir/tinystr.cpp.o CMakeFiles/tinyxml.dir/tinyxml.cpp.o CMakeFiles/tinyxml.dir/tinyxmlerror.cpp.o CMakeFiles/tinyxml.dir/tinyxmlparser.cpp.o
/usr/bin/ranlib libtinyxml.a
[ 13%] Built target tinyxml
[ 17%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeBody.cpp.o
[ 20%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeCollision.cpp.o
[ 24%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugContact.cpp.o
[ 27%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugObject.cpp.o
[ 31%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeEigenSolver.cpp.o
[ 34%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeEntityInformer.cpp.o
[ 37%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeGeometry.cpp.o
[ 41%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeJoint.cpp.o
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp: In member function ‘virtual void OgreOde::PistonJoint::setAxisDelta(const Ogre::Vector3&, const Ogre::Vector3&)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp:863:2: warning: ‘void dJointSetPistonAxisDelta(dxJoint*, dReal, dReal, dReal, dReal, dReal, dReal)’ is deprecated (declared at /usr/include/ode/objects.h:2057)
/home/rory/Programming/ogreode/Core/src/OgreOdeJoint.cpp:864:74: warning: ‘void dJointSetPistonAxisDelta(dxJoint*, dReal, dReal, dReal, dReal, dReal, dReal)’ is deprecated (declared at /usr/include/ode/objects.h:2057)
[ 44%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeMaintainedList.cpp.o
[ 48%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeMass.cpp.o
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp: In constructor ‘OgreOde::CapsuleMass::CapsuleMass(Ogre::Real, Ogre::Real, const Ogre::Vector3&, Ogre::Real)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:124:2: warning: ‘void dMassSetCappedCylinderTotal(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:85)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:124:80: warning: ‘void dMassSetCappedCylinderTotal(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:85)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp: In member function ‘void OgreOde::CapsuleMass::setDensity(Ogre::Real, Ogre::Real, const Ogre::Vector3&, Ogre::Real)’:
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:135:2: warning: ‘void dMassSetCappedCylinder(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:84)
/home/rory/Programming/ogreode/Core/src/OgreOdeMass.cpp:135:78: warning: ‘void dMassSetCappedCylinder(dMass*, dReal, int, dReal, dReal)’ is deprecated (declared at /usr/include/ode/mass.h:84)
[ 51%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdePrecompiledHeaders.cpp.o
[ 55%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeSpace.cpp.o
[ 58%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeStepper.cpp.o
[ 62%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshData.cpp.o
[ 65%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshDataManager.cpp.o
[ 68%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeUtility.cpp.o
[ 72%] Building CXX object Core/CMakeFiles/OgreOde_Core.dir/src/OgreOdeWorld.cpp.o
Linking CXX shared library ../lib/libOgreOde_Core.so
/usr/bin/c++ -fPIC -O3 -DNDEBUG -shared -Wl,-soname,libOgreOde_Core.so.1.3.0 -o ../lib/libOgreOde_Core.so.1.3.0 CMakeFiles/OgreOde_Core.dir/src/OgreOdeBody.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeCollision.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugContact.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeDebugObject.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeEigenSolver.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeEntityInformer.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeGeometry.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeJoint.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeMaintainedList.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeMass.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdePrecompiledHeaders.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeSpace.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeStepper.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshData.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeTriangleMeshDataManager.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeUtility.cpp.o CMakeFiles/OgreOde_Core.dir/src/OgreOdeWorld.cpp.o ../../ode/ode/src/.libs/libode.a -lOgreMain
[ 72%] Built target OgreOde_Core
[ 75%] Building CXX object prefab/CMakeFiles/OgreOde_Prefab.dir/src/OgreOdePrefabObject.cpp.o
[ 79%] Building CXX object prefab/CMakeFiles/OgreOde_Prefab.dir/src/OgreOdeRagdoll.cpp.o
[ 82%] Building CXX object prefab/CMakeFiles/OgreOde_Prefab.dir/src/OgreOdeVehicle.cpp.o
Linking CXX shared library ../lib/libOgreOde_Prefab.so
/usr/bin/c++ -fPIC -O3 -DNDEBUG -shared -Wl,-soname,libOgreOde_Prefab.so.1.3.0 -o ../lib/libOgreOde_Prefab.so.1.3.0 CMakeFiles/OgreOde_Prefab.dir/src/OgreOdePrefabObject.cpp.o CMakeFiles/OgreOde_Prefab.dir/src/OgreOdeRagdoll.cpp.o CMakeFiles/OgreOde_Prefab.dir/src/OgreOdeVehicle.cpp.o ../lib/libOgreOde_Core.so.1.3.0 -lOgreMain ../../ode/ode/src/.libs/libode.a -lOgreMain -Wl,-rpath,/home/rory/Programming/ogreode/build/lib:
[ 82%] Built target OgreOde_Prefab
[ 86%] Building CXX object loader/CMakeFiles/OgreOde_Loader.dir/src/OgreOdeDotLoader.cpp.o
/usr/bin/ld: ../tinyxml/libtinyxml.a(tinyxml.cpp.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
../tinyxml/libtinyxml.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make[2]: *** [lib/libOgreOde_Loader.so.1.3.0] Error 1
make[1]: *** [loader/CMakeFiles/OgreOde_Loader.dir/all] Error 2
make: *** [all] Error 2
Linking CXX shared library ../lib/libOgreOde_Loader.so
/usr/bin/c++ -fPIC -O3 -DNDEBUG -shared -Wl,-soname,libOgreOde_Loader.so.1.3.0 -o ../lib/libOgreOde_Loader.so.1.3.0 CMakeFiles/OgreOde_Loader.dir/src/OgreOdeDotLoader.cpp.o ../lib/libOgreOde_Core.so.1.3.0 ../lib/libOgreOde_Prefab.so.1.3.0 -lOgreMain ../tinyxml/libtinyxml.a ../lib/libOgreOde_Core.so.1.3.0 ../../ode/ode/src/.libs/libode.a -lOgreMain -Wl,-rpath,/home/rory/Programming/ogreode/build/lib:


Any ideas what I might be doing wrong? I've been struggling with this for ages and if anyone else could at least share how they got it to work that would be greatly appreciated :)

Bruno

29-09-2011 03:46:21

Never mind, I found another forum topic where someone else had the same problem and was able to follow their instructions

dermont

29-09-2011 03:50:50

It looks like tinyxml is not built with fPIC, in tinyxml/CMakeLists.txt try adding fPIC to the comple flags:


..
ADD_LIBRARY(tinyxml STATIC ${tinyxml_SOURCE_FILES})

SET_TARGET_PROPERTIES( tinyxml PROPERTIES COMPILE_FLAGS -fPIC)

## section: set link libraries

..


Run make VERBOSE=1 so you can see exactly what is going on.

Bruno

29-09-2011 12:06:22

Thanks, that solved the problem :D

Unfortunately, the project I'm working on needs to run on both Linux and Windows, and when I tried to compile it on Windows I got a different error:
PS C:\OgreSDK_mingw_v1-7-2\ogreaddons\trunk\ogreode\build> mingw32-make
(many lines of output, everything going normally)
Linking CXX shared library ..\bin\libOgreOde_Core_d.dll
G__~1.EXE: /SUBSYSTEM:WINDOWS: No such file or directory
mingw32-make[2]: *** [bin/libOgreOde_Core_d.dll] Error 1
mingw32-make[1]: *** [Core/CMakeFiles/OgreOde_Core.dir/all] Error 2
mingw32-make: *** [all] Error 2

This is probably a fairly simple problem, but I'm not very experienced using make so I have no idea what's happening :P

dermont

29-09-2011 12:58:29

There was a patch for mingw I uploaded some time ago.
http://sourceforge.net/tracker/?func=de ... id=1064241

I'm not sure if all the updates are still applicable but you should be able to find what you are looking for in there.

Bruno

29-09-2011 13:16:21

Works like a charm now, that you very much :)