树莓派使用libtorch构建C++程序的链接错误解决求助
树莓派ARM架构下libtorch编译的原子操作链接错误解决方案
问题背景
我正在树莓派上开发基于libtorch和OpenCV的C++程序,起初遇到了架构不匹配的链接问题:
- CMake输出显示libtorch依赖的
libc10.so是x86-64架构,而树莓派是ARM架构,导致make链接阶段报错:/usr/lib/libc10.so: file not recognized: file format not recognized collect2: error: ld returned 1 exit status - 验证文件架构后确认问题:
# 不符合架构的x86-64版libc10.so /usr/lib/libc10.so: ELF 64-bit LSB pie executable, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=f8019a46a003bc238af0fb3fb8331af8af69aa33, not stripped # 正确适配ARM的libtorch.so /usr/lib/libtorch.so.3.0.0: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=2f8320292f01aab7c9e2e2577b3be2025689c0a7, stripped
于是我尝试在树莓派上从头编译PyTorch以生成ARM适配的libtorch,但编译数小时后卡在链接阶段,出现一系列原子操作函数未定义的错误:
/usr/bin/ld: /home/<myuser>/pytorch_install/pytorch/build/lib/libcaffe2.so: undefined reference to `__atomic_fetch_add_8' /usr/bin/ld: /home/<myuser>/pytorch_install/pytorch/build/lib/libcaffe2.so: undefined reference to `__atomic_load_8' /usr/bin/ld: /home/<myuser>/pytorch_install/pytorch/build/lib/libcaffe2.so: undefined reference to `__atomic_exchange_8' /usr/bin/ld: /home/<myuser>/pytorch_install/pytorch/build/lib/libcaffe2.so: undefined reference to `__atomic_fetch_sub_8' /usr/bin/ld: /home/<myuser>/pytorch_install/pytorch/build/lib/libcaffe2.so: undefined reference to `__atomic_compare_exchange_8' collect2: error: ld returned 1 exit status
不过编译过程已经生成了ARM架构的libc10.so,替换后项目构建有进展但仍有格式问题,说明完成完整的libtorch编译能解决根本问题。
可行的解决方案
针对树莓派ARM架构下PyTorch编译时的原子操作链接错误,有几个经过验证的修复方向:
- 显式链接atomic库
在编译PyTorch时,给链接器添加-latomic参数,直接解决原子函数的引用问题:# 方式1:在make时指定链接选项 make ATOMIC_LINK_OPTS="-latomic" # 方式2:在cmake配置阶段就设置链接参数 cmake .. -DCMAKE_EXE_LINKER_FLAGS="-latomic" -DCMAKE_SHARED_LINKER_FLAGS="-latomic" - 跳过测试程序编译
错误出现在测试用例的链接阶段,我们可以禁用测试编译,既加快编译速度又规避这个错误:cmake .. -DBUILD_TEST=OFF - 升级系统gcc版本
树莓派默认的低版本gcc对64位原子操作的支持有限,升级到gcc-8及以上版本后,再重新编译PyTorch,也能解决这类兼容性问题。
后续进展
我已经找到描述相同问题的社区issue,正在尝试上述解决方案,成功后会撰写完整的树莓派编译libtorch的教程。
内容的提问来源于stack exchange,提问作者totok
相关产品推荐
相关产品推荐

