[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++ Linker

    g++ -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 to std::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 function ps10_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 to std::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
    DEBUG

    compiler flags:

    -c
    -fmessage-length=0
    -fexceptions
    -fident
    -pipe
    -fvisibility=hidden
    -fvisibility-inlines-hidden
    -fPIC

    libs:

    X11
    Xext
    GL
    Xrandr
    Xxf86vm
    GLU
    OgreMain_d

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


Anmelden zum Antworten