C++未定义对“__atomic_load_16”的引用

ss2ws0br  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(521)

我有链接错误,当尝试做一个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/lib 64/libatomic.so.1.1.0”。确实该文件不存在。
有什么建议吗?
加文

2nbm6dog

2nbm6dog1#

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将有机会以更快的速度执行更多的现代指令,请参见下面的评论。
-march=native中,编译器可以利用更多的指令集来翻译代码。(您的CPU比Generial-x86/64-CPU更好)
或者与libatomic链接以避免分配-march
例如,使用tbb时,一般会要求libatomic来做算法。

相关问题