链接我正在处理的项目时,链接器会出现以下错误:
/usr/bin/ld: ../Includes and Libs/lib/libsfml21rca.a(SoundFile.o): undefined reference to symbol 'sf_read_short@@libsndfile.so.1.0'
/usr/bin/ld: note: 'sf_read_short@@libsndfile.so.1.0' is defined in DSO /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libsndfile.so so try adding it to the linker command line
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libsndfile.so: could not read symbols: Invalid operation
Run Code Online (Sandbox Code Playgroud)
问题是,libsndfile.so已经在libsfml21rca.a之前链接了,所以我不知道问题出在哪里.
我正在使用Code :: Blocks 10.05
提前感谢您的帮助
编辑:
这是链接命令:
g ++ -L"包含和Libs/lib"-L"包含和Libs/lib/raknet3_731"-L"包含和Libs/lib/d3d_new/x86"-L"包含和Libs/lib/ogg"-L"包含和Libs/lib/sdl"-LBullet/lib -o(filename)...(很多目标文件)-lGLEW -lglfw -lGL -lGLU -lpthread -lopenal -ljpeg -lfreetype -lsndfile -lXrandr -lsfml-system -lsfml-window -lsfml-audio ../Bullet/lib/LinearMath.lib ../Bullet/lib/BulletCollision.lib ../Bullet/lib/BulletDynamics.lib"../Includes和Libs/lib/raknet3_731/RakNetLibStaticDebug.lib""../Includes和Libs/lib/libsfml21rca.a"../../../../../../home/msabol/Desktop/SFML/sfml2st/sfmlVideo/sfmlVideo/ bin/Release/libsfmlVideo.a ../../../../../../home/msabol/Desktop/SFML/sfmlVideo/bin/Release/libsfmlVideo.a
我发现了未定义引用的原因.我检查了我的.o文件中的符号,但它们只是丢失了.只是不在那里.没有明显的理由.我检查了妥协.o文件的来源,但一切似乎都没问题.我认为它可能是那些讨厌的#ifdef ... #endif块之一,狡猾地隐藏在代码的行中,像熊陷阱,等待它的受害者.但我找不到任何东西.将一些函数定义移动到文件的最后并将它们封装在#ifdef ... #endif适合Linux的块中之后,这些符号神奇地出现了,一切都很好.感谢您的时间.
过时了,不要读.
我最近被分配到一个大项目,我的工作是让它在Linux平台上运行.不幸的是,在我之前编写整个项目的程序员做了一个非常糟糕的工作,通过将文件
B3D_Base.h(几乎每个标题都包含在内)创建#included到项目中的几乎每个头文件和源文件中创建了大量的循环依赖(创建了170多个文件#include "B3D_Base.h"线).这在Windows和Linux上编译期间没有引起任何问题.但是,这会在Linux上的链接阶段导致大量"未定义的引用"错误,即使所有目标文件和库都已链接.
ld在链接期间意识到通过所有目标文件的单次迭代的限制,我问:
有没有办法强制ld通过对象和库进行多次迭代,可能解决所有700多个未定义的引用错误,或者是我唯一的机会实际链接项目只是将所有#include "B3D_Base.h"行替换为正确的包含到所需的标题?
这是一个我应该在Linux上运行的混乱的例子:
有一个头文件B3D_Base.h,向其中包括B3D_Loading3.h,含有类B3D_LOADING3.文件B3D_Loading3.cpp仅B3D_Base.h包含和Base中未包含的内存管理器类.B3D_LOADING3 g_Loading3;声明一个实例B3D_Base.h并初始化+在项目的许多其他部分中使用.一切都编译得很好,但是当谈到链接时,我会遇到很多'undefined reference to g_Loading3'错误.还有更多这样的错误,抱怨对类实例和函数的未定义引用.这么干净的代码.
我将提供一个SSCCE示例,正如kfsone所要求的:
B3D_Base.h
... (many other includes)
#include "B3D_Loading3.h"
extern B3D_LOADING3 g_Loading3;
... (includes go on)
Run Code Online (Sandbox Code Playgroud)
B3D_Loading3.h/B3D_Loading.cpp
a full definition of class B3D_LOADING3, but no real declaration of g_Loading3 …Run Code Online (Sandbox Code Playgroud)