如何解决链接库顺序问题?

时间:2010-11-23 11:03:57

标签: c gcc linker

我正在尝试编译一个需要使用多个库的C程序。问题是,库链接的顺序会导致编译失败。

有没有让GCC找出正确的订单,或者让我找出正确的订单而不必尝试各种可能性?

mipsel-linux-gcc ffmpeg_mips_test.c -o ffmpeg_mips_test -Wall -v -I/ffmpegMIPS/includeffmpegMIPS/
                 -L/ffmpegMIPS/libffmpegMIPS/ -lavformat -lavcodec -lavutil -lswscale -lm -lpthread

我现在这样做的方式是从一个开始,然后在发生错误时添加更多库,但有时感觉就像进步一样,有时它似乎只是我走到了死胡同。

[edit]由于未定义的引用[/ edit]

,编译失败

2 个答案:

答案 0 :(得分:8)

您有几个选择

1)您可以向具有依赖关系的库添加其他调用

2)您可以使用--start-group / --end-group选项,如下所示:

mipsel-linux-gcc ffmpeg_mips_test.c -o ffmpeg_mips_test -Wall -v -I/ffmpegMIPS/includeffmpegMIPS/
-L/ffmpegMIPS/libffmpegMIPS/ -Wl,--start-group -lavformat -lavcodec -lavutil -lswscale -Wl,--end-group -lm -lpthread

以下是描述其用途的ld联机帮助页条目

  

搜索指定的档案   反复直到没有新的未定义   引用已创建。通常,一个   存档只在搜索中搜索一次   命令它在。上指定   命令行。如果是那个符号   需要存档来解决问题   未定义的符号由   出现的存档中的对象   稍后在命令行上,链接器   无法解决这个问题   参考。通过对档案进行分组,   他们都被反复搜索,直到   所有可能的参考文献都已得到解决。

答案 1 :(得分:2)

不推荐使用-lpthread。您应该使用-pthread,gcc将生成pthread支持所需的任何选项和库。

至于其他人,将它们按正确的顺序排列仅仅是了解它们之间的依赖关系。如果A取决于B,则-lA应出现在命令行的-lB之前。在您的情况下,-lm是系统数学库(出于愚蠢的遗留原因,它仅与主libc分开)并且不依赖于任何其他内容,因此它应始终位于命令行的末尾。 -lavutilffmpeg及其包含的库使用的实用函数库,因此它应该位于所有其他ffmpeg库之后。 -lswscale是其他库可能需要的图像缩放库,所以我会在-lavformat-lavcodec之后但在-lavutil之前将其放在-lavutil之前,以防它需要{{1}的函数}}

最后,在ffmpeg世界中,编解码器被认为是基础,容器被认为是它们之上的一层(而不是某些框架的反面),因此-lavformat取决于-lavcodec 。因此,示例中的最终顺序应为:

-lavformat -lavcodec -lswscale -lavutil -lm

并且-pthread可以在命令行中的任何位置;它通常会导致gcc在最后放置一个隐藏的-lpthread,但可能会根据需要在不同的系统上执行不同的操作。