C++ LLVM:将全局变量链接类型设为linkonce

C++ LLVM:将全局变量链接类型设为linkonce,c++,clang,llvm,C++,Clang,Llvm,我正在使用llvm编译器生成C代码 编译器中有以下代码,在我的C代码中声明了一个全局变量: GlobalVariable* gvar_int64_test = new GlobalVariable(M, IntegerType::get(M.getContext(), 64), false, GlobalValue::LinkOnceAnyLinkage, 0, "test"); 编译器并行运行以编译多个C文件。但我希望所有编译文件中名为“test”的

我正在使用llvm编译器生成C代码

编译器中有以下代码,在我的C代码中声明了一个全局变量:

GlobalVariable* gvar_int64_test = new GlobalVariable(M, 
    IntegerType::get(M.getContext(), 64),
    false,
    GlobalValue::LinkOnceAnyLinkage,
    0,
    "test");
编译器并行运行以编译多个C文件。但我希望所有编译文件中名为“test”的所有全局变量共享相同的值或地址。因此,我认为可能将链接类型设置为“LinkOnceAnyLink”可能会起作用

但是,当运行通行证时。它说:

invalid linkage type for global declaration
i64* @test
将其更改为ExternalLinkage不会引发此问题,但我确实需要它具有linkonce属性

我想知道可能是什么问题


谢谢大家的潜在帮助

你把这个放在哪里?在一个.h文件中?我真的不明白你所说的链接是什么意思[或者你为什么想要/需要它]

假设这是一个文件,比如myheader.h,那么您需要的是:

#ifdef DEFINE_GLOBAL
GlobalVariable* gvar_int64_test = what you specified ...
#else
extern GlobalVariable* gvar_int64_test;
#endif
在包含.h文件之前,请在一个且仅一个.cpp文件中执行以下操作:

#define DEFINE_GLOBAL
#include <myheader.h>

嗨,谢谢你的回复。我实际上是把上面的代码放在llvm编译器中。把它放在头文件中是行不通的,因为这样做需要修改数千个其他的C文件。@user3761728仍然没有得到它[我做C已经35年了]。你能发布更多的代码来说明吗。你的意思是你的原始构造是由数千个文件完成的吗?也就是说,有很多这样的gvar分散?顺便说一句,我有很多perl脚本,可以随时更改数千个C文件。如果def不在a.h中,为什么会有冲突?你能发布两个或多个文件,清楚地显示冲突,可能还有一些额外的东西吗?