我正在尝试从共享相同.h的各种.cpp文件创建动态库。它是这样的:
// mylib1.cpp
namespace mylib {
namespace part1 {
void init() {
part1::commonvar = true;
}
}
}
和
// mylib2.cpp
namespace mylib {
namespace part2 {
void check() {
if (part1::commonvar == true) {
// do something
}
}
}
}
这是常见的标题
// 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中,如下所示:
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 ”的成员,我也可以使用预处理器命令。
感谢您的帮助
答案 0 :(得分:2)
非const
个全局变量具有外部链接。您正在将commonvar
全局变量的相同定义导入到多个翻译单元中,并且链接器最终会抱怨您多次定义该符号,违反了一个定义规则。
您应该使用extern
关键字将全局变量的定义转换为declaration
,并在一个 .cpp
文件中定义全局变量:
<强> MyLib.h 强>
namespace mylib {
namespace part1 {
extern bool commonvar;
// ^^^^^^
void init();
}
namespace part2 {
void check();
}
}
MyLib.cpp (或任何其他.cpp
文件,只要只有一个)
namespace mylib {
namespace part1 {
bool commonvar;
}
}
如果您想知道为什么您的包含警卫(如果您使用它们)并未阻止不同翻译单元中同一符号的多个定义,see this
答案 1 :(得分:0)
以下
怎么样? bool* init(){
static bool commonvar = false;
return &commonvar;
}