c - 链接目标文件和链接包含这些文件的静态库

标签 c gcc static linker ld

你好 Stack Overflow 社区,

我正在从事一个 c 项目,将多个 c 程序交织成一个二进制文件,它可以将交织的程序作为 treads 或 fork 运行以进行基准测试。

因此,我在所需程序的每个程序文件夹中运行 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。所以我的问题:这是如何工作的?哪里不一样了?

最佳答案

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

关于c - 链接目标文件和链接包含这些文件的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7180021/

相关文章:

c - 输出以下内容

c - 计算第 n 个素数的最短方法是什么?

linux - (TCP)Echo客户端: Automatic disconnect after message sent

c - gcc 链接器不会自动包含依赖库

java - "Non-static method cannot be referenced from static context"错误

java - Java中的main方法必须是静态的吗?

java - Android库类的静态变量的生命周期是多少?

使用 Delphi 使用 C dll

将字符串复制到结构体数组的元素

c - Makefile 未编译目录中的所有 C 文件