【问题标题】:linking object files and linking static libraries containing these files链接目标文件和链接包含这些文件的静态库
【发布时间】:2011-08-24 17:53:57
【问题描述】:

你好 Stack Overflow 社区,

我正在开发一个 c 项目,将多个 c 程序交错到一个二进制文件中,该二进制文件可以将交错的程序作为踏板或叉子运行以进行基准测试。

因此,我在所需程序的每个程序文件夹中运行 make,并将所有带有“ld -r”的 .o 文件预链接到一个新的 .o 文件。之后,我为每个“大”.o 文件添加了一个特定的命名函数,它除了运行每个程序的 main() 并提供 argc 和 argv 之外什么都不做。然后我使用 objcopy 对每个全局符号进行本地化,除了未知符号和我的特定函数之一,它将运行 main()。最后,我将这些经过处理的 .o 文件与我的程序链接在一起,该程序将特定的命名函数作为线程、分叉或另一个运行。

现在我的问题/问题: 我遇到了静态库的问题。我使用 ffmpeg 进行测试,它构建静态库,例如 libavcodc 和 libavutil 等。不幸的是,“ld -r”不链接 .a 文件。所以我尝试使用 ar -x 提取这些库,然后以上述方式将提取的 .o 文件链接到“大”新 .o 文件。但我没有工作,因为 libavcodec 和 libavutil 都包含文件 ff_inverse.o。当我只是构建 ffmpeg 时,这显然不是问题,它将链接这些静态库。但是,两个库都包含它,所以必须有一个机制来做出选择,使用和链接哪个 ff_inverse.o。所以我的问题:这是如何工作的?区别在哪里?

【问题讨论】:

    标签: c gcc static linker ld


    【解决方案1】:

    ld 使用普通链接的方式是优先考虑库。命令行中第一个列出的库首先被链接,只有当符号仍未解析时,它才会移动到下一个库。在链接静态库时,它会忽略每个 .o 文件的名称,因为名称不是必需的,只有导出的符号是必需的。您可能希望通过按排序顺序提取库来模拟这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2013-04-25
      相关资源
      最近更新 更多