未解析的外部符号“std::atomic_fetch_add”

Posted

技术标签:

【中文标题】未解析的外部符号“std::atomic_fetch_add”【英文标题】:unresolved external symbol "std::atomic_fetch_add" 【发布时间】:2017-06-14 13:41:32 【问题描述】:

考虑这个简单的代码:

#include <iostream>
#include <atomic>

void add(std::atomic<double> & a, double c)

    std::atomic_fetch_add(&a, c);


int main()

    std::atomic<double> a;

    a.store(0);
    std::cout << a.load() << std::endl;

    add(a, 5.0);
    std::cout << a.load() << std::endl;

    std::cin.get();

编译会得到:

错误 LNK2019: 无法解析的外部符号 "double __cdecl std::atomic_fetch_add(struct std::atomic *,double)" (??$atomic_fetch_add@N@std@@YANPAU?$atomic@N@0@N@Z ) 在函数“void __cdecl add(struct std::atomic &,double)”中引用 (?add@@YAXAAU?$atomic@N@std@@N@Z)

根据this,atomic_fetch_add是在&lt;atomic&gt;中定义的,那么这是怎么回事?

【问题讨论】:

谁告诉你std::atomic 专门用于double 是的,但是none of the overloads take a double @Slava 我没有看到任何我无法将其用于double的地方! @Jaber en.cppreference.com/w/cpp/atomic/atomic - 明确列出的类型,std::atomic 完全或部分专用,double 不在列表中。 【参考方案1】:

如documentation中所述:

标准库为以下类型提供了 std::atomic 模板的特化:

并且double 不在列表中。非成员函数也有注意事项:

所有成员都有非成员函数模板等价物 std::atomic 的函数。那些非成员函数可能是 对非特化的类型额外重载 std::atomic,但能够保证原子性。 唯一的这种类型 在标准库中是 std::shared_ptr

所以不支持double

【讨论】:

你知道任何为非整数类型实现原子算术的库吗? @Jaber,从来不需要这样的野兽,我使用互斥锁 - 过早优化是万恶之源。 澄清您的答案:double 支持基本原子操作,例如(loadstore 等);但不支持专用操作(如算术+-、...),如here 所述。

以上是关于未解析的外部符号“std::atomic_fetch_add”的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:未解析的外部符号

C++ - 未解析的外部符号

未解析的外部符号 C++

错误 LNK2001:未解析的外部符号

错误 LNK2001:未解析的外部符号 WINAPI [重复]

带有 Catch 库的未解析外部符号