当尝试对 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”。事实上该文件不存在。
有什么建议么?
Gavin
Clang 编译器也有同样的问题,简而言之:安装 libatomic 并与其链接。 (在 RHEL 中,库名为libatomic.so.1
所以你可能需要-l:libatomic.so.1
设置名称)
https://releases.llvm.org/14.0.0/tools/clang/docs/Toolchain.html#libatomic-gnu 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 将有机会以更快的速度执行更现代的指令,请参阅下面的评论。感谢@彼得·科德斯 https://stackoverflow.com/users/224132/peter-cordes
Within -march=native
,编译器可以利用更多的指令集来翻译代码。 (你的CPU比Generial-x86/64-CPU
)
或者链接到libatomic
以避免分配-march
.
例如,使用tbb时,通常会要求libatomic来制定算法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)