C 对象符号覆盖库符号?
当您在两个不同的C源文件中定义相同的函数(非静态)时,编译它们并将它们与Microsoft链接器链接,您会收到一条重复的符号错误消息,正如预期的那样 另一方面,当您定义与标准库函数名称匹配的函数时,例如C 对象符号覆盖库符号?,c,windows,visual-c++,linker,portable-executable,C,Windows,Visual C++,Linker,Portable Executable,当您在两个不同的C源文件中定义相同的函数(非静态)时,编译它们并将它们与Microsoft链接器链接,您会收到一条重复的符号错误消息,正如预期的那样 另一方面,当您定义与标准库函数名称匹配的函数时,例如cos(未定义为COMDAT),则没有错误;您的定义将以静默方式覆盖标准库定义。这也是我们想要的行为,但我正试图弄清楚确切的规则是什么 “对象文件中定义的符号覆盖库文件中定义的符号”规则还是其他规则?我在PE规范中找不到这方面的任何提及,但可能我忽略了一些东西。MS linker仅链接静态库中解决
cos
(未定义为COMDAT),则没有错误;您的定义将以静默方式覆盖标准库定义。这也是我们想要的行为,但我正试图弄清楚确切的规则是什么
“对象文件中定义的符号覆盖库文件中定义的符号”规则还是其他规则?我在PE规范中找不到这方面的任何提及,但可能我忽略了一些东西。MS linker仅链接静态库中解决依赖关系所需的那些成员对象。静态库中未使用的成员对象将被优化掉。因此,如果静态库成员对象中存在重复符号,但不需要该成员对象,则不会出现错误。另见: MS linker似乎也支持某种弱符号: 但我在MSDN里找不到这个