【问题标题】:Linking two object files with a common symbol用一个公共符号链接两个目标文件
【发布时间】:2010-12-26 05:01:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c linker


    【解决方案1】:

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

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

    从目标文件创建静态库会因工具链而异。在 GCC 中使用 ar 实用程序,对于 MSVC lib.exe(或使用静态库项目向导)。

    【讨论】:

    • 会不会报错,1.o2.o定义了相同的符号(都在libsome.a),我正在尝试静态链接这个库?跨度>
    • @dmak_k:我不知道;你为什么要这么做!?可能会发生两件事; 1)链接器可以找到两个定义并报错; 2)它可以用找到的第一个符号来解析符号,在这种情况下,它将取决于目标文件在库中出现的顺序。在大多数情况下,您希望 (1) 发生,因为 (2) 是模棱两可的,并且会导致难以找到错误。你当然可以试试看。
    【解决方案2】:

    这里有个危险,这里的关键字叫做插入依赖代码

    让我在这里举个例子:

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

    这只是要记住的事情。

    在您的情况下,您可以“覆盖”(我使用引号来强调)另一个功能,但是您怎么知道正在使用哪个 foobar?当试图找出调用了哪个foobar 时,这可能会导致调试问题。

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

    【讨论】:

      【解决方案3】:

      你可以把它做成一个 .a 文件...然后编译器得到这个符号,以后就不会做文件了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 2014-04-04
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        相关资源
        最近更新 更多