Raspbian Bullseye (11) 系统C++ Atomic原子操作链接报错问题
问题原因
- 链接顺序错误:GCC 链接器
ld按从左到右的顺序处理参数,依赖库-latomic需要放在目标文件/源文件的后面。你当前的命令把-latomic放在main.cpp前面,链接器处理到libatomic的时候还未扫描到main.cpp编译产物中的未定义符号,不会主动从libatomic中导出所需函数,最终导致符号找不到。 - 可选补充:你系统的GCC默认编译目标是armv6架构,该架构原生不支持8字节原子操作,所以必须依赖
libatomic库实现对应功能;如果要针对树莓派4的armv8架构优化,也可以指定架构参数让编译器直接生成原生原子指令,不需要额外链接libatomic。 - 可选排查:如果修复顺序后仍有问题,可检查是否安装了libatomic开发包,你当前只有运行时的
.so.1版本软链接,可能缺少编译链接需要的无版本号libatomic.so软链接。
解决方案
- 直接修复链接顺序,把
-latomic放到编译命令末尾即可,绝大多数情况执行该命令就能正常编译:
g++ -L/usr/lib/arm-linux-gnueabihf main.cpp -latomic
- 若要针对树莓派4硬件优化,不需要依赖
libatomic,可指定架构参数编译:
g++ -march=armv8-a -mfpu=crypto-neon-fp-armv8 -mfloat-abi=hard main.cpp
指定armv8架构后,编译器会直接生成原生64位原子操作指令,无需额外链接libatomic库。
3. 如果执行第一条命令后仍报错找不到libatomic.so,安装对应开发包即可:
sudo apt install libatomic1 libatomic-ops-dev
内容的提问来源于stack exchange,提问作者The Quantum Physicist
相关产品推荐
相关产品推荐

