Ubuntu 23.10编译OpenCV 4.8遇R_X86_64_PC32链接错误求解决
问题分析与解决方法
问题根源
链接错误的核心原因是你本地编译安装的gflags静态库未使用-fPIC参数编译,而OpenCV构建共享库(.so文件)时,要求链接的依赖库必须支持位置无关代码(PIC),否则会触发 relocation 错误。
具体解决步骤
1. 重新编译安装gflags(推荐方案)
卸载现有不符合要求的gflags,重新编译时强制添加-fPIC参数:
- 先清理已安装的gflags文件:
sudo rm -rf /usr/local/lib/libgflags* /usr/local/include/gflags /usr/local/lib/cmake/gflags* - 下载gflags源码(或使用你已有的源码包):
git clone https://github.com/gflags/gflags.git cd gflags && mkdir build && cd build - 用cmake配置编译参数,强制启用
-fPIC:
注:如果需要动态库,可将cmake -DCMAKE_CXX_FLAGS="-fPIC" -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local ..BUILD_SHARED_LIBS=OFF改为ON,动态库默认会自动启用-fPIC - 编译并安装:
make -j$(nproc) sudo make install - 回到OpenCV的build目录,清空原有构建文件后重新执行cmake和make:
cd ~/builddir-opencv rm -rf * cmake CXXFLAGS="$CXXFLAGS -fPIC" -DOPENCV_FORCE_VTK=TRUE -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules ../opencv-4.x make -j$(nproc)
2. 禁用OpenCV对gflags的依赖(快速方案)
如果你的场景不需要用到依赖gflags的模块(比如sfm),可直接在cmake配置时禁用gflags:
cd ~/builddir-opencv rm -rf * cmake CXXFLAGS="$CXXFLAGS -fPIC" -DOPENCV_FORCE_VTK=TRUE -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules -DWITH_GFLAGS=OFF ../opencv-4.x make -j$(nproc)
3. 强制OpenCV编译静态库(备选方案)
若你只需要OpenCV的静态库,也可避开共享库的链接限制,cmake时添加参数:
cd ~/builddir-opencv rm -rf * cmake CXXFLAGS="$CXXFLAGS -fPIC" -DOPENCV_FORCE_VTK=TRUE -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules -DBUILD_SHARED_LIBS=OFF ../opencv-4.x make -j$(nproc)
内容的提问来源于stack exchange,提问作者Raphael10
相关产品推荐
相关产品推荐

