使用更多c++文件在头文件中声明的全局变量
Use global variable declared in header by more C++ files
我正在尝试从共享相同.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"的成员,而且我也可以使用预处理器命令。
谢谢你的帮助
非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;
}
}
如果你想知道为什么你的include保护符(如果你正在使用它们)没有阻止在不同的翻译单位中对同一符号的多个定义,请参阅
bool* init(){
static bool commonvar = false;
return &commonvar;
}
相关文章:
- .cpp和.h文件中的模板专用化声明
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 用"=default"声明的函数应该只在头文件中执行
- 调用在 HXX 文件中声明的静态数据成员
- 如何在 c++ 的不同文件中声明类?
- 如何在头文件中声明类模板(由于循环依赖关系)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 在.cpp文件之间传递结构声明,而不使用全局头文件
- 为什么要将函数声明和定义放在单独的文件中
- 枚举前向声明与头文件
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在带有类型保护的模板文件中使用前向声明
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 在多个头文件中从接口声明被覆盖的函数时,如何避免重复代码?
- 应该在类中的文件声明为静态
- 是否应从头文件声明中排除辅助函数?(C++)
- 哪个C++头文件声明 strlen
- 如何为头文件声明“#include”以避免“error lnk2005”
- 打开文件和关闭文件声明定位:最佳做法,优点,缺点
- 说双向文件声明不隐式设置标志是否正确