使用公共符号链接两个目标文件

时间:2009-12-13 17:32:30

标签: c linker

如果我有两个目标文件都定义了一个符号(功能)“foobar”。

是否可以告诉链接器遵守我在命令行调用中给出的obj文件顺序,并始终从第一个文件中获取符号,而不是从后者获取符号?

AFAIK“弱”编译指示仅适用于共享库,但不适用于目标文件。

请回答您知道的所有C / C ++编译器/链接器/操作系统组合因为我是灵活的并且使用大量编译(sun studio,intel,msvc,gcc,acc)。

3 个答案:

答案 0 :(得分:2)

我相信你需要从第二个目标文件创建一个静态库,然后链接第一个目标文件然后链接库。如果符号由目标文件解析,则链接器将不会在库中搜索它。

或者将两个目标文件放在单独的静态库中,然后链接顺序将由它们在命令行中的出现来确定。

根据工具链的不同,从目标文件创建静态库会有所不同。在GCC中使用ar实用程序,对于MSVC lib.exe(或使用静态库项目向导)。

答案 1 :(得分:2)

此处存在危险,此处的关键字称为 Interpositioning dependent code

我在这里举个例子:

假设您编写了一个名为malloc的自定义例程。你在标准库中链接,会发生什么,需要使用malloc(标准函数)的函数将使用你的自定义版本,最终结果是代码可能会因为意外的副作用而变得不稳定什么东西会显得“破碎”。

这是要记住的事情。

在你的情况下,你可以'覆盖'(我使用引号来强调)另一个函数,但那你怎么知道正在使用哪个foobar?在尝试确定调用哪个foobar时,这可能导致调试悲痛。

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:0)

您可以将其设为.a文件...然后编译器获取符号并且以后不会使用