C++ 使用更多C+;在标头中声明的全局变量+;文件夹
我正在尝试从共享相同.h的各种.cpp文件创建一个动态库。是这样的:C++ 使用更多C+;在标头中声明的全局变量+;文件夹,c++,variables,dll,export,global,C++,Variables,Dll,Export,Global,我正在尝试从共享相同.h的各种.cpp文件创建一个动态库。是这样的: // mylib1.cpp namespace mylib { namespace part1 { void init() { part1::commonvar = true; } } } g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o g++ -Wall -s -O2 -c mylib2.cpp -o mylib2
// mylib1.cpp
namespace mylib {
namespace part1 {
void init() {
part1::commonvar = true;
}
}
}
g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o
g++ -Wall -s -O2 -c mylib2.cpp -o mylib2.o
g++ -Wall -s -O2 -shared -o MyLib.dll -Wl,--out-implib=lib/libMyLib.dll.a mylib1.o mylib2.o
及
这是公共标题
// mylib.h
#ifdef __cplusplus
extern "C" {
#endif
namespace mylib {
namespace part1 {
bool commonvar = false;
void init();
}
namespace part2 {
void check();
}
}
#ifdef __cplusplus
}
#endif
我使用GCC(MingW)编译并链接到一个单独的DLL中,如下所示:
// mylib1.cpp
namespace mylib {
namespace part1 {
void init() {
part1::commonvar = true;
}
}
}
g++ -Wall -s -O2 -c mylib1.cpp -o mylib1.o
g++ -Wall -s -O2 -c mylib2.cpp -o mylib2.o
g++ -Wall -s -O2 -shared -o MyLib.dll -Wl,--out-implib=lib/libMyLib.dll.a mylib1.o mylib2.o
所以,我的问题是,当我这么做的时候,当我试图链接这两个对象时,我得到了该变量的多个定义错误。因此,我想知道是否有一种变通方法可以使commonvar在两个名称空间中都是通用的,但在两个对象文件中都不重复。如有必要,我可以将其设置为名称空间“mylib”的成员,也可以使用预处理器命令
感谢您的帮助以下内容如何
bool* init(){
static bool commonvar = false;
return &commonvar;
}
非
const
全局变量具有外部链接。您正在将相同的commonvar
全局变量定义导入多个转换单元,链接器最终会抱怨您多次定义该符号,违反了“一个定义”规则
您应该使用extern
关键字将全局变量的定义转换为声明
,并在一个.cpp
文件中定义全局变量:
MyLib.h
namespace mylib {
namespace part1 {
extern bool commonvar;
// ^^^^^^
void init();
}
namespace part2 {
void check();
}
}
MyLib.cpp(或任何其他.cpp
文件,只要它只有一个)
如果您想知道为什么include-guard(如果您正在使用它们)不阻止在不同的翻译单元中对同一符号进行多个定义,…作为最后一个解决方案,我将创建一个函数来返回该值,因为编译器单独编译每个源文件时,将在多个目标文件中具有相同的符号,最后链接将生成链接器错误。可以使用extern关键字来避免这种情况。我会试试这个。我知道引擎盖下发生了什么,我只是不知道如何让它被理解为一个外部/导出元素。就像魅力一样。可以在cpp或标题中初始化该变量?Thanks@ali:在
.cpp
中。标题中的内容只是一个声明。