C++ 对 `__atomic_load_16' 的未定义引用

问题描述 投票:0回答:1

尝试对 16 字节块进行原子加载时出现链接错误。我有以下代码:

#include <atomic>

struct MyStruct{
  long x; long y;
};

struct X{
  std::atomic<MyStruct> myStruct;
};

int main(){
  X x;
  MyStruct s = atomic_load(&x.myStruct);
}

当我用(g++ 版本 5.3.1)编译它时:

g++ --std=c++11 test.cpp

我得到错误

/tmp/ccrvzLMq.o: In function `std::atomic<MyStruct>::load(std::memory_order) const':
test.cpp:(.text._ZNKSt6atomicI8MyStructE4loadESt12memory_order[_ZNKSt6atomicI8MyStructE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status

如果(根据另一篇文章中的提示)我添加“-latomic”标志,我会收到错误“/bin/ld: 找不到/usr/lib64/libatomic.so.1.1.0”。事实上,该文件不存在。

有什么建议吗?

加文

c++ atomic
1个回答
2
投票

Clang 编译器的相同问题,简而言之:安装 libatomic 并与之链接。 (在 RHEL 中库名为

libatomic.so.1
所以你可能需要
-l:libatomic.so.1
来设置名称)

https://releases.llvm.org/14.0.0/tools/clang/docs/Toolchain.html#libatomic-gnu

如果编译器不知道如何将你的'c++_atomic_operation_code'翻译成CPU指令,它会向libatomic寻求帮助。默认编译参数使程序更普遍可在 x86/64 CPU 上运行,因此一些 CPU 指令被禁用。

另一方面,使用 libatomic 将有机会以更快的速度执行更多现代指令,请参阅下面的评论。感谢@Peter Cordes

-march=native
内,编译器可以利用更多的指令集来翻译代码。 (你的CPU比
Generial-x86/64-CPU
好)

或与

libatomic
链接以避免分配
-march

比如用tbb,一般会要求libatomic做算法。

© www.soinside.com 2019 - 2024. All rights reserved.