对象符号覆盖库符号?

rwa*_*ace 5 c windows linker portable-executable visual-c++

当您在两个不同的C源文件中定义相同的功能(非静态),对其进行编译并将其与Microsoft链接器链接时,将按预期方式收到重复的符号错误消息。

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

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

Mat*_*ias 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 上找不到这个。