树莓派3B(Buster系统)安装OpenCV时出现未定义引用错误
问题描述
我在运行Buster(2019年7月版本)的Raspberry Pi 3 Model B上,按照指南安装OpenCV 4.1.1。执行make -j4命令后遇到以下链接错误:
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to
__atomic_fetch_add_8' /usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to__atomic_fetch_sub_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to__atomic_store_8' /usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to__atomic_load_8'
/usr/bin/ld: ../../lib/libopencv_core.so.4.1.1: undefined reference to `__atomic_compare_exchange_8'
collect2: error: ld returned 1 exit status
make[2]: *** [modules/core/CMakeFiles/opencv_test_core.dir/build.make:571: bin/opencv_test_core] Error 1
make[1]: *** [CMakeFiles/Makefile2:1459:modules/core/CMakeFiles/opencv_test_core.dir/all] Error 2
make: *** [Makefile:163: all] Error 2
我的CMake配置命令为:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=$cwd/installation/OpenCV-"$cvVersion" \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.5/site-packages \ -D WITH_QT=ON \ -D WITH_OPENGL=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D BUILD_EXAMPLES=ON ..
目前我已执行make clean和单核心make命令尝试解决,但错误仍存在,请问该如何解决?
解决方案
这个错误是因为Raspberry Pi 3的ARM架构在编译时需要显式链接libatomic库,OpenCV的某些原子操作依赖它,但默认CMake配置没有自动添加这个链接参数。你可以按以下步骤解决:
修改CMake配置命令,添加链接
libatomic的参数:
在原CMake命令末尾加上-D CMAKE_EXE_LINKER_FLAGS="-latomic"和-D CMAKE_SHARED_LINKER_FLAGS="-latomic",完整命令如下:cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=$cwd/installation/OpenCV-"$cvVersion" \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D OPENCV_PYTHON3_INSTALL_PATH=$cwd/OpenCV-$cvVersion-py3/lib/python3.5/site-packages \ -D WITH_QT=ON \ -D WITH_OPENGL=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D BUILD_EXAMPLES=ON \ -D CMAKE_EXE_LINKER_FLAGS="-latomic" \ -D CMAKE_SHARED_LINKER_FLAGS="-latomic" ..重新生成Makefile并编译:
- 先执行
make clean清理之前的编译残留 - 运行修改后的CMake命令重新配置项目
- 最后执行
make -j4(如果编译时Pi负载过高,也可以改用-j2,避免资源耗尽)
- 先执行
验证解决效果:
编译完成后可以运行OpenCV的核心测试程序bin/opencv_test_core,如果不再出现链接错误,就说明问题已经解决了。
补充说明:这类问题在ARM架构设备上比较常见,尤其是使用较新版本的OpenCV时,原子操作的依赖没有被CMake自动处理,显式指定链接libatomic就能解决这个问题。
内容的提问来源于stack exchange,提问作者SRR

