即使已经链接了库,仍然出现符号未定义的错误

12

当我在链接一个项目时,链接器会报以下错误:

/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

问题在于,libsndfile.so已经在libsfml21rca.a之前被链接了,所以我不知道问题出在哪里。

我正在使用Code :: Blocks 10.05

提前感谢您的帮助

编辑:

这是链接命令:

  

g++ -L“Includes and Libs / lib” -L“Includes and Libs / lib / raknet3_731” -L“Includes and Libs / lib / d3d_new / x86” -L“Includes and Libs / lib / ogg” -L“Includes and Libs / lib / sdl ”-LBullet / lib-o(文件名)...(大量的对象文件)-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 and Libs / lib / raknet3_731 / RakNetLibStaticDebug.lib”“../Includes and Libs / lib / libsfml21rca.a”../../../../../../home/msabol/Desktop/SFML/sfml2st/sfmlVideo/sfmlVideo/bin/Release/libsfmlVideo.a ../../../../../../home/msabol/Desktop/SFML/sfmlVideo/bin/Release/libsfmlVideo.a


4
尝试更改链接的顺序? - PP.
1
我应该如何准确地进行更改?所有东西都按正确的顺序链接,或者至少看起来是这样。 - matuzalem
将 C::B 在连接到您的问题时使用的命令添加。 (不要将其作为评论添加!) - greatwolf
可能是一个重复的问题,与库已链接但引用未定义有关。 - user529758
@H2CO3,同时也不是故意重复的,我只是没有意识到链接顺序上的错误。 - matuzalem
1个回答

10
链接器只在库文件上运行一次。因此,如果您在Library A中需要Library B中的内容,则需要使用g++ objects... -llibA -llibB,如果使用g++ objects... -llibB -llibA,将会出现您所展示的错误。

因此,在您的情况下,请将-lsndfile放在"../Includes and Libs/lib/libsfml21rca.a"之后。

(是谁想把空格放在"Includes and Libs"目录中的?这不是我见过的最好的想法……)


1
我会试一试。为了辩护,我几天前才加入这个项目,所以所有可怕的名称(还有更多)都不是我起的。 编辑: 该死,它成功了!谢谢,Mats Peterson。 - matuzalem
@Mats,坦率地说,我觉得单次库遍历更令人望而却步。正是由于ld链接器的限制,出现了无数像OP这样的SO问题。例如,微软的LINK工具就没有这个问题。Embarcadero的ilinker也是如此。 - greatwolf
很遗憾,我的工作是让项目在Unix平台上运行。微软的LINK就这样了。 - matuzalem
它是开源的,我相信补丁会受到欢迎...虽然我怀疑这可能会在某个地方破坏东西 - 或者至少如果真的很容易修复而没有任何缺点,那么有人会修复它。 - Mats Petersson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接