【问题标题】:Object symbols override library symbols?对象符号覆盖库符号?
【发布时间】:2014-04-19 16:09:07
【问题描述】:

当您在两个不同的 C 源文件中定义相同的函数(非静态)、编译它们并使用 Microsoft 链接器链接它们时,您会收到一条重复符号错误消息,正如预期的那样。

另一方面,当您定义一个与标准库函数名称匹配的函数时,例如cosnot 定义为 COMDAT)则没有错误;您的定义会默默地覆盖标准库定义。这也是期望的行为,但我试图弄清楚确切的规则是什么。

规则是“在目标文件中定义的符号覆盖在库文件中定义的符号”还是其他?我在 PE 规范中找不到任何提及这一点,但也许我忽略了一些东西。

【问题讨论】:

    标签: c windows visual-c++ linker portable-executable


    【解决方案1】:

    MS 链接器仅链接静态库中解析依赖关系所需的那些成员对象。静态库中未使用的成员对象被优化掉。因此,如果静态库成员对象中有重复符号,但不需要该成员对象,则不会出现错误。也可以看看: http://msdn.microsoft.com/en-us/library/72zdcz6f.aspx

    似乎 MS 链接器也支持某种弱符号: http://support.microsoft.com/kb/148652/EN-US http://nikoniko-programming.blogspot.ch/2010/09/aliasing-symbol-names-during-link-time.html

    但我在 MSDN 中找不到这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多