[solved] Linker Probleme unter Linux (g++)
-
Hallo miteinander,
ich verzweifel gerade an einem Linker Problem unter Linux, und zwar versuche ich, eine Grafikengine (Ogre3D) in Eclipse zu übersetzen. Es gibt bereits einen Codeblocks Workspace für Linux, von dem ich die Konfiguration versucht habe zu übernehmen.
Die Engine besteht aus mehreren shared libs. Die Hauptbibliothek (OgreMain) wird ohne Probleme kompiliert und auch verlinkt.Eine darauf aufbauende Bibliothek (RenderSystemGL) kompiliert zwar ebenfalls, allerdings bekomme ich eine Unmenge an undefinierten Referenzen zur c++ Standardbibliothek (der Standardweg mittels ./configure make make install funktioniert hingegen).
hier die Linker Ausgabe:
**** Build of configuration Debug for project RenderSystem_GL ****
Building target: libRenderSystem_GL_d.so
Invoking: GCC C++ Linkerg++ -L"/home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/OgreMain/Debug" -shared -o"libRenderSystem_GL_d.so" ./src/nvparse/_ps1.0_lexer.o ./src/nvparse/_ps1.0_parser.o ./src/nvparse/_rc1.0_lexer.o ./src/nvparse/_rc1.0_parser.o ./src/nvparse/_ts1.0_lexer.o ./src/nvparse/_ts1.0_parser.o ./src/nvparse/_vs1.0_lexer.o ./src/nvparse/_vs1.0_parser.o ./src/nvparse/avp1.0_impl.o ./src/nvparse/nvparse.o ./src/nvparse/nvparse_errors.o ./src/nvparse/ps1.0_program.o ./src/nvparse/rc1.0_combiners.o ./src/nvparse/rc1.0_final.o ./src/nvparse/rc1.0_general.o ./src/nvparse/ts1.0_inst.o ./src/nvparse/ts1.0_inst_list.o ./src/nvparse/vcp1.0_impl.o ./src/nvparse/vp1.0_impl.o ./src/nvparse/vs1.0_inst.o ./src/nvparse/vs1.0_inst_list.o ./src/nvparse/vsp1.0_impl.o ./src/OgreGLATIFSInit.o ./src/OgreGLContext.o ./src/OgreGLDefaultHardwareBufferManager.o ./src/OgreGLEngineDll.o ./src/OgreGLFBOMultiRenderTarget.o ./src/OgreGLFBORenderTexture.o ./src/OgreGLFrameBufferObject.o ./src/OgreGLGpuNvparseProgram.o ./src/OgreGLGpuProgram.o ./src/OgreGLGpuProgramManager.o ./src/OgreGLHardwareBufferManager.o ./src/OgreGLHardwareIndexBuffer.o ./src/OgreGLHardwareOcclusionQuery.o ./src/OgreGLHardwarePixelBuffer.o ./src/OgreGLHardwareVertexBuffer.o ./src/OgreGLPBRenderTexture.o ./src/OgreGLPixelFormat.o ./src/OgreGLPlugin.o ./src/OgreGLRenderSystem.o ./src/OgreGLRenderTexture.o ./src/OgreGLSupport.o ./src/OgreGLTexture.o ./src/OgreGLTextureManager.o ./src/glew.o ./src/atifs/src/ATI_FS_GLGpuProgram.o ./src/atifs/src/Compiler2Pass.o ./src/atifs/src/ps_1_4.o ./src/GLX/OgreGLXContext.o ./src/GLX/OgreGLXGLSupport.o ./src/GLX/OgreGLXRenderTexture.o ./src/GLX/OgreGLXUtils.o ./src/GLX/OgreGLXWindow.o ./src/GLSL/src/OgreGLSLExtSupport.o ./src/GLSL/src/OgreGLSLGpuProgram.o ./src/GLSL/src/OgreGLSLLinkProgram.o ./src/GLSL/src/OgreGLSLLinkProgramManager.o ./src/GLSL/src/OgreGLSLProgram.o ./src/GLSL/src/OgreGLSLProgramFactory.o -lX11 -lXext -lGL -lXrandr -lXxf86vm -lGLU -lOgreMain_d
./src/nvparse/_ps1.0_lexer.o: In function
ps10_lex()': /home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem\_GL/Debug/ps1.0\_tokens.l:82: undefined reference tostd::allocator<char>::allocator()'
/home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem_GL/Debug/ps1.0_tokens.l:82: undefined reference tostd::allocator<char>::~allocator()' /home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem\_GL/Debug/ps1.0\_tokens.l:82: undefined reference tostd::allocator<char>::~allocator()'
...
./src/nvparse/_ps1.0_parser.o: In functionps10_parse()': /home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem\_GL/Debug/ps1.0\_grammar.y:154: undefined reference tostd::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem_GL/Debug/ps1.0_grammar.y:159: undefined reference tostd::basic\_string<char, std::char\_traits<char>, std::allocator<char> >::~basic_string()' /home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem\_GL/Debug/ps1.0\_grammar.y:189: undefined reference tostd::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
/home/schmelly/Dateien/Projekte/Cpp/ogrenew/LinuxEclipse/RenderSystems/RenderSystem_GL/Debug/ps1.0_grammar.y:190: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
...und viele weitere, ähnliche Fehler...
Die von Codeblocks übernommene Konfiguration (defines, compiler settings etc.) sieht wie folgt aus:
defines:
OGRE_GL_USE_MULTITEXTURING
OGRE_GLPLUGIN_EXPORTS
OGRE_GCC_VISIBILITY
PIC
YY_NEVER_INTERACTIVE
YY_NO_UNPUT
DEBUGcompiler flags:
-c
-fmessage-length=0
-fexceptions
-fident
-pipe
-fvisibility=hidden
-fvisibility-inlines-hidden
-fPIClibs:
X11
Xext
GL
Xrandr
Xxf86vm
GLU
OgreMain_dHat jemand eine Ahnung, warum es hier mit dem Linken nicht klappt? Ich habe mal in die generierten Makefiles geschaut; in denen ist die Option -nostdlibs aktiviert. Ich würde die Eclipse Konfiguration aber gerne möglichst generisch halten, ohne explizit auf bestimmte Standardbibliotheken zu verlinken (in Codeblocks waren diese Einstellungen wie gesagt ebenfalls ohne das -nostdlibs flag).
viele Grüße,
David
-
-nostdlibs ist aktiviert? Dann linkt er aber auch gegen keine Standard-Librarys.
Dann kann er die entsprechenden Referenzen natuerlich auch nicht finden.
gruss
v R
-
Im uebrigen solltest du, laut gcc-Doku, gegen libgcc (-lgcc) linken, wenn du
-nostdlib verwendest, damit du keine undefined references bzgl. gcc-internen
Subroutinen bekommst.gruss
v R
-
Nein nein ich verwende das Flag -nostdlibs nicht. Es wird von den autotools benutzt, die ich in Eclipse aber nur sehr ungern nutzen möchte.
-
Um das nochmal deutlich zu machen:
Wenn ich Ogre3D mit den Autotools kompiliere (./configure, make, make install) geht alles glatt.
Ich würde aber gerne in Eclipse kompilieren und auf die Autotools verzichten. (Bei der libOgreMain.so hat ja in Eclipse auch alles funktioniert, ich kann mir zur Zeit einfach keinen Reim darauf machen, warum es bei der libRenderSystem_GL.so nicht klappt)
-
Auf meinem Debian-Sid System habe ich seit dem Update von libstdc++-4.1.1 auf libstdc++-4.1.2 von das gleiche Problem, wenn ich -fvisibility-inlines-hidden in die CXXFLAGS hinzufüge. Auf Ubuntu ist es laut diesem Bugreport
https://bugs.launchpad.net/ubuntu/+source/gcc-4.1/+bug/109262
das gleiche.
Mit g++-4.2, also libstdc++-4.2, funktioniert alles wunderbar.Ob du nun Debian/Ubuntu Nutzer bist oder nicht, das einfachste ist -fvisibility-inlines-hidden wegzulassen.
Zu -fvisibility=hidden kann ich nur sagen, dass es AFAIK nur von den Entwicklern der Bibliothek gesetzt werden sollte, da der Quellcode angepasst werden muss.
-fvisibility-inlines-hidden hingegen sollte ohne eingriff in den Quellcode funktionieren, sollte.MfG Maik
-
Das ist exakt die Lösung für mein Problem, danke sehr
