Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对象符号覆盖库符号?_C_Windows_Visual C++_Linker_Portable Executable - Fatal编程技术网

C 对象符号覆盖库符号?

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

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

另一方面,当您定义与标准库函数名称匹配的函数时,例如
cos
(未定义为COMDAT),则没有错误;您的定义将以静默方式覆盖标准库定义。这也是我们想要的行为,但我正试图弄清楚确切的规则是什么


“对象文件中定义的符号覆盖库文件中定义的符号”规则还是其他规则?我在PE规范中找不到这方面的任何提及,但可能我忽略了一些东西。

MS linker仅链接静态库中解决依赖关系所需的那些成员对象。静态库中未使用的成员对象将被优化掉。因此,如果静态库成员对象中存在重复符号,但不需要该成员对象,则不会出现错误。另见:

MS linker似乎也支持某种弱符号:

但我在MSDN里找不到这个