我正在用clang 6.0编译两个文件:testA.c
和testB.c
。
在这两个文件上,我正在运行一个自定义编译器通道,该通道将插入称为globalVarTest
的零初始化全局变量。我将此类全局变量的链接设置为LinkOnceODRLinkage
。
现在,当我将testA.c
和testB.c
链接在一起时(即,通过分别编译它们而获得的目标文件),链接器会抱怨globalVarTest
有多个定义。
LinkOnceODRLinkage
是否不应该告诉链接程序,如果两个定义都匹配,则符号相同,因此在构建最终可执行文件时可以选择两个定义中的任何一个吗?
更新: 相同的过程在Linux上也适用。这是Windows链接程序的限制吗?我已经可以使用COMDAT部分实现相同的效果,但是我想知道为什么LLVM在没有我需要显式设置COMDATS的情况下不会自动使用该机制。
答案 0 :(得分:0)
我从LLVM邮件列表中得到了答案。即使过去曾经使用LinkOnceODRLinkage
在Windows上也无法使用。
达到相同效果的最佳方法是显式使用COMDAT节。显然,这是通过设置LinkOnceODRLinkage
自动发生的,直到行为改变为止。