我在完成操作系统课程设计时, 遇到了链接错误: undefined reference to `__atomic_exchange_1’。
经过研究, 我写出了最小的能够产生链接错误的代码如下:
#include <atomic> int main() { std::atomic<char> a(0); return a.exchange(1); }
编译指令为: riscv64-unknown-elf-g++ -std=c++11 -Wall atomic.cc, 运行此命令, 立即可以得到上述链接错误。此外, 若将代码中char改为short, 可以得到类似的链接错误: undefined reference to `__atomic_exchange_2’。
经过研究, 这是因为RV64没有对8位整数或16位整数的原子操作的支持, 从而导致GCC不支持__atomic_exchange_1或__atomic_exchange_2。
其中, _1或_2指的是操作数的长度是1字节或2字节, 由于RV64支持32位整数或64位整数的原子操作, __atomic_exchange_4或__atomic_exchange_8有定义, 也就不会产生链接错误。读者可以试试将char换成int或者long。
根本原因是代码中使用了std::atomic<char>等, 间接用到了8位整数的原子操作。
__atomic_compare_exchange_1等链接错误原理类似。
特此记录。
请您尝试 -latomic
https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html