std::atomic 库依赖 (gcc 4.7.3)

Posted

技术标签:

【中文标题】std::atomic 库依赖 (gcc 4.7.3)【英文标题】:std::atomic library dependency (gcc 4.7.3) 【发布时间】:2014-08-14 14:49:34 【问题描述】:

我一直在尝试使用 std::atomic 进行编译,但我得到了对 __atomic_load、__atomic_store 和 __atomic_store_16 的未解析引用。

我知道在更高版本的 gcc(4.8+?)中包含 -latomic,但我使用 gcc 4.7.3 进行编译;我已经尝试添加 -latomic_ops 和 -latomic_ops_gpl,但似乎都没有多大作用。

我现在正在安装 gcc 4.8.1,但我确实有一个真正需要为 4.7.3 编译的发布平台。

非常感谢。

编辑: 好的,这是导致我遇到的问题的一些代码:

atomics.cpp
#include <atomic>
#include <stdint.h>

struct dataStruct 
    int a;
    uint16_t b;
    float c;
    dataStruct(int ai, uint16_t bi, float ci)  noexcept : a(ai), b(bi), c(ci) 
    
    dataStruct() noexcept : dataStruct(0,0,0) 
    
;

int main() 
    std::atomic<dataStruct> atomicValue;

    atomicValue = dataStruct(10, 0, 0);

    return atomicValue.load().b;

使用“g++-4.8.1 *.cpp -std=c++0x -latomic”,可以正常编译。

使用“g++-4.7.3 *.cpp -std=c++0x -pthread -lpthread -latomic_ops”,它会失败并显示以下内容:

/tmp/ccQp8MJ2.o: In function `std::atomic<dataStruct>::load(std::memory_order) const':
atomics.cpp:(.text._ZNKSt6atomicI10dataStructE4loadESt12memory_order[_ZNKSt6atomicI10dataStructE4loadESt12memory_order]+0x2f): undefined reference to `__atomic_load'
/tmp/ccQp8MJ2.o: In function `std::atomic<dataStruct>::store(dataStruct, std::memory_order)':
atomics.cpp:(.text._ZNSt6atomicI10dataStructE5storeES0_St12memory_order[_ZNSt6atomicI10dataStructE5storeES0_St12memory_order]+0x35): undefined reference to `__atomic_store'
collect2: error: ld returned 1 exit status

【问题讨论】:

恐怕这行不通 - 我已经把它链接了,但又添加了它,但仍然没有乐趣。 确保按正确的顺序排列。发布您的调用。 用于链接(常见的是自定义库):g++ *.o -lcommon -lboost_regex -lpthread -lrt -ldl -Wl,-Bstatic -lprotobuf -Wl,-Bdynamic -lboost_system -lpthread 不,只是-pthread,而不是-lpthread 好的,试过了。感谢你目前的帮助。我已经用代码和调用更新了我的帖子。 【参考方案1】:

好的,终于找到答案了:https://gcc.gnu.org/wiki/Atomic/GCCMM

事实证明,4.7 实际上没有“官方”原子支持(只是头文件)。如果你想在 4.7 编译器中使用 atomics,你必须下载该页面上链接的源代码并自己构建它

gcc -c -o libatomic.o libatomic.c
ar rcs libatomic.a libatomic.o

然后,您可以使用构建它

g++-4.7.3 -std=c++0x atomics.cpp -latomic -L./

【讨论】:

以上是关于std::atomic 库依赖 (gcc 4.7.3)的主要内容,如果未能解决你的问题,请参考以下文章

为啥标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

std::atomic 和 std::condition_variable 等待、notify_* 方法之间的区别

第31课 std::atomic原子变量

C++ error: use of deleted function ‘std::atomic<short unsigned int>::atomic(const std::atomic<short

CentOS6.5 gcc升级到4.8.2

Ubuntu安装gcc的时候把软件不小心全删了,该怎么恢复?