当您在两个不同的C源文件中定义相同的函数(非静态)时,编译它们并将它们与Microsoft链接器链接,您会得到重复的符号错误消息,如预期的那样。
另一方面,当您定义一个与标准库函数的名称匹配的函数时,例如cos
(不定义为COMDAT)然后没有错误;您的定义将以静默方式覆盖标准库定义。这也是理想的行为,但我试图找出确切的规则是什么。
目标文件中定义的规则符号是否覆盖库文件中定义的符号'或者是其他东西?我在PE规范中找不到这一点,但也许我忽视了一些事情。
答案 0 :(得分: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中找不到这个。