【问题标题】:How do I resolve linker library order problems?如何解决链接器库顺序问题?
【发布时间】:2010-11-23 11:03:57
【问题描述】:

我正在尝试编译一个需要使用多个库的 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]

【问题讨论】:

    标签: c gcc linker


    【解决方案1】:

    你有几个选择

    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 联机帮助页条目

    搜索指定的档案 反复直到没有新的未定义 创建参考。通常,一个 存档仅在 订单上指定的 命令行。如果其中的一个符号 需要存档来解决 一个未定义的符号 出现的档案中的对象 稍后在命令行上,链接器 将无法解决 参考。通过对档案进行分组, 他们都被反复搜索,直到 所有可能的引用都已解析。

    【讨论】:

      【解决方案2】:

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

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

      最后,在ffmpeg 的世界中,编解码器被认为是基础,容器被认为是它们之上的一层(与某些框架相反),所以-lavformat 依赖于-lavcodec。因此,您示例中的最终顺序应该是:

      -lavformat -lavcodec -lswscale -lavutil -lm
      

      -pthread 可以在命令行的任意位置;它通常会导致 gcc 在最后放置一个隐藏的-lpthread,但可能会在不同的系统上根据需要做不同的事情。

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多