我的代码调用函数 __ atomic_add_fetch 中有一条指令。编译此代码时,出现如下编译错误
错误:对'__atomic_fetch_add_8'的未定义引用
我真的不明白为什么我在调用__atomic_add_fetch时会抛出未定义的__atomic_fetch_add_8引用。有人可以帮我理解在编译此代码时到底发生了什么吗?
注意:我特别希望了解“内部正在发生的事情,将__atomic_add_fetch转换为__atomic_fetch_add_8”。不是解决编译问题的解决方案。
答案 0 :(得分:7)
您应该使用标准化的atomic_fetch_add
。
无论如何,看起来您的__atomic_fetch_add
具有给定的参数类型(大概是8个字节的整数)无法解析为平台上的汇编指令,因此它被解析为一个函数您需要为其链接libatomic
(-latomic
)的呼叫。
详细信息编辑:
在gcc上,__atomic_fetch_add
似乎是用于实现stdatomic.h
的{{1}}(仅是其简单宏名称)的内置编译器。如前所述,您实际上应该使用标准名称atomic_fetch_and_explicit
,而不是atomic_fetch_add_explicit
的不可移植的实现细节。
无论如何,问题似乎是gcc和clang在ARM上没有使用指令来实现__atomic_fetch_add
(与ARM64或x86-64不同),而是它们生成了对(global-lock-using )函数从atomic_fetch_and_explicit
库中获取。该函数的名称似乎是从您尝试fetch_add到的整数中的字节数派生的
({libatomic
如果您是fetch_adding到__atomic_fetch_add_8
_Atomic uin64_t
(如果您要提取到__atomic_fetch_add_4
等)。