访问静态原子数据成员导致链接器错误

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 外。并且只为一个分配存储空间。

您忘记了 onOrOffMyClass 的范围名称。你需要

std::atomic_bool MyClass::onOrOff(false);

Live Example