访问静态原子数据成员导致链接器错误
Accessing a static atomic data member causes a linker error
如何在不导致链接器错误的情况下访问静态原子变量?
我已将代码示例缩减为以下内容:
#include <iostream>
#include <atomic>
class MyClass
{
public:
static std::atomic_bool onOrOff;
};
std::atomic_bool onOrOff(false);
int main(int argc, const char * argv[]) {
std::cout << "It is: " << (MyClass::onOrOff? "on": "off") << "\n";
return 0;
}
这会导致以下链接器错误(MaxOS X 10.11,XCode 7.2):
Undefined symbols for architecture x86_64:
"MyClass::onOrOff", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
注意:如果我删除 main() 访问中的行,则不会出现构建错误
MyClass::onOrOff
,所以我认为这排除了编译器选项的问题。
这个:
std::atomic_bool onOrOff(false);
应该是:
std::atomic_bool MyClass::onOrOff(false);
目前您已经声明了两个不同的 onOrOff
变量,一个在 class 内,一个在 class 外。并且只为一个分配存储空间。
您忘记了 onOrOff
是 MyClass
的范围名称。你需要
std::atomic_bool MyClass::onOrOff(false);
如何在不导致链接器错误的情况下访问静态原子变量?
我已将代码示例缩减为以下内容:
#include <iostream>
#include <atomic>
class MyClass
{
public:
static std::atomic_bool onOrOff;
};
std::atomic_bool onOrOff(false);
int main(int argc, const char * argv[]) {
std::cout << "It is: " << (MyClass::onOrOff? "on": "off") << "\n";
return 0;
}
这会导致以下链接器错误(MaxOS X 10.11,XCode 7.2):
Undefined symbols for architecture x86_64:
"MyClass::onOrOff", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
注意:如果我删除 main() 访问中的行,则不会出现构建错误
MyClass::onOrOff
,所以我认为这排除了编译器选项的问题。
这个:
std::atomic_bool onOrOff(false);
应该是:
std::atomic_bool MyClass::onOrOff(false);
目前您已经声明了两个不同的 onOrOff
变量,一个在 class 内,一个在 class 外。并且只为一个分配存储空间。
您忘记了 onOrOff
是 MyClass
的范围名称。你需要
std::atomic_bool MyClass::onOrOff(false);