我正在尝试编译一个需要使用多个库的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]
,编译失败答案 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分开)并且不依赖于任何其他内容,因此它应始终位于命令行的末尾。 -lavutil
是ffmpeg
及其包含的库使用的实用函数库,因此它应该位于所有其他ffmpeg
库之后。 -lswscale
是其他库可能需要的图像缩放库,所以我会在-lavformat
和-lavcodec
之后但在-lavutil
之前将其放在-lavutil
之前,以防它需要{{1}的函数}}
最后,在ffmpeg
世界中,编解码器被认为是基础,容器被认为是它们之上的一层(而不是某些框架的反面),因此-lavformat
取决于-lavcodec
。因此,示例中的最终顺序应为:
-lavformat -lavcodec -lswscale -lavutil -lm
并且-pthread
可以在命令行中的任何位置;它通常会导致gcc在最后放置一个隐藏的-lpthread
,但可能会根据需要在不同的系统上执行不同的操作。