8

以下代码无法链接:

#include <atomic>                                                                                                                                                             
struct A
{
    unsigned long a;
    unsigned long b;
};                                                                                                                                                           
struct B
{
    void set(A tmp)
    {
        _a.store(tmp);
    }
    std::atomic<A> _a;
 };                                                                                                                                                           

 int main()
{
   B b;
   b.set(A());
   return  0;
}

出现以下错误:

/tmp/cc8gyaZM.o: In function `std::atomic<A>::store(A, std::memory_order)':
dryn.cpp:     (.text._ZNSt6atomicI1AE5storeES0_St12memory_order[_ZNSt6atomicI1AE5storeES0_St12memory_order]+0x3e): undefined reference to `__atomic_store_16'

如果我将 unsigned long-s 替换为大小不超过 int 的任何内容,则编译得很好。使用 g++ 4.7.2 。你知道这是为什么吗?

用命令编译:

g++ dryn.cpp --std=c++11
4

1 回答 1

6

正如Zeta所回答的:

GCC 4.7 中的原子 API 不完整:

  • 当无锁指令不可用(通过硬件或操作系统支持)时,原子操作将作为函数调用留给库来解决。由于时间限制和未最终确定的 API,GCC 4.7 没有提供 libatomic。这很容易通过遇到以 开头的不满意的外部符号来确定__atomic_*

由于没有libatomic附带 GCC 4.7,您需要使用另一个编译器,它实际上支持您想要的功能或提供缺少的功能(示例实现)。

于 2014-11-15T12:46:44.987 回答