代码之家  ›  专栏  ›  技术社区  ›  Nikola Smiljanić

两个静态libs,两个不同的向量实现,链接器会做什么?

  •  1
  • Nikola Smiljanić  · 技术社区  · 15 年前

    假设我们有两个静态库,使用不同的 std::vector . 这两个二进制文件的代码都是 push_back pop_back (因为vector通常只是头)。当我们试图在一个项目中使用这两个库时,链接器会做什么?会出错吗?链接器是否可以删除这些方法的一个实现,以便可以执行以下操作:

    推挽 从第二个库调用 推挽 从第一个库实现

    后背 从第一个库调用 后背 从第二个库实现

    4 回复  |  直到 15 年前
        1
  •  3
  •   Stack Overflow is garbage    15 年前

    会出错吗?取决于你如何定义“错误”。

    它可能不会在链接时给您一个错误。但它肯定会破坏您的可执行文件。链接器 假设 ,当它遇到符号的多个定义时,它们是相同的,因此除了其中一个之外,其余的都可以丢弃。如果它们不相同,你就违反了一个定义规则,这意味着你将进入一个未定义的行为领域。任何事情都可能发生。很可能,你会看到随机崩溃。

        2
  •  1
  •   anon    15 年前

    编译系统对模板采用的最常见(但不是唯一)方法是让编译器贪婪地实例化每个翻译单元中使用的所有模板,从而导致多个实例化。然后链接器静默地丢弃重复项。

    但是,我绝对不会依赖这种行为来处理同一(命名)模板的两个不同实现。

        3
  •  1
  •   R Samuel Klatchko    15 年前

    最有可能的是,将为外部调用选择这两个实现中的一个。

    因为这里有太多的哥特人,我不会这么做的。以下是一些问题:

    1. 当一个对象被创建时,它被称为处理分配多少字节的位置。所以假设两个实现使用不同的成员。如果所选的外部函数是假定较大大小的函数,则可能会损坏内存。
    2. 虽然将为外部调用选择这两个实现中的一个,但编译器可能已经内联了其他一些方法。对于作为链接时间丢失的实现,其内联调用仍将存在于代码中,并且很可能会出现行为错误。
        4
  •  0
  •   Hamish Grubijan    15 年前

    你最终会根据链接人的心情打电话给对方。一个糟糕的处境。