小编Mat*_*lem的帖子

未定义的符号引用,即使库已链接

链接我正在处理的项目时,链接器会出现以下错误:

/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

c++ linker codeblocks

10
推荐指数
1
解决办法
2万
查看次数

休斯顿,我们有一个未定义的参考

MEGAEDIT 3000

我发现了未定义引用的原因.我检查了我的.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"行替换为正确的包含到所需的标题?

附录1:

这是一个我应该在Linux上运行的混乱的例子:

有一个头文件B3D_Base.h,向其中包括B3D_Loading3.h,含有类B3D_LOADING3.文件B3D_Loading3.cppB3D_Base.h包含和Base中未包含的内存管理器类.B3D_LOADING3 g_Loading3;声明一个实例B3D_Base.h并初始化+在项目的许多其他部分中使用.一切都编译得很好,但是当谈到链接时,我会遇到很多'undefined reference to g_Loading3'错误.还有更多这样的错误,抱怨对类实例和函数的未定义引用.这么干净的代码.

附录#2:

我将提供一个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)

c++ linker undefined-reference

6
推荐指数
1
解决办法
921
查看次数

标签 统计

c++ ×2

linker ×2

codeblocks ×1

undefined-reference ×1