CMake同时链接Open3D和OpenCV时报OpenCV未定义引用如何解决?
问题根因
该问题和::导入目标、小写库名的写法差异完全无关,核心原因是:
- 官方预编译的Open3D库默认内置了裁剪版的OpenCV,
Open3D::Open3D导入目标会自动将内置OpenCV的头文件路径、库搜索路径加入编译链,且优先级高于你系统安装的标准OpenCV。 - 链接时优先加载了Open3D内置的裁剪版OpenCV,该版本裁剪了大量你用到的功能(比如videoio模块的VideoCapture实现),因此找不到对应函数定义。
可行解决方案
方案1:调整链接规则(无需重编译Open3D,最快修复)
统一使用CMake导入目标配置,明确让系统标准OpenCV的优先级高于Open3D内置版本,修改后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.20) project(ORB_SLAM) # 先查找系统标准OpenCV,提前锁定版本和路径 find_package(OpenCV REQUIRED) # 再查找Open3D find_package(Open3D REQUIRED) set(CMAKE_CXX_STANDARD 20) add_executable(ORB_SLAM src/main.cpp) # 链接时先写Open3D,再写OpenCV的相关配置,让链接器优先用系统OpenCV的符号补全 target_link_libraries(ORB_SLAM PRIVATE Open3D::Open3D ${OpenCV_LIBS} # 也可以替换为明确用到的模块目标:OpenCV::videoio OpenCV::core OpenCV::imgproc 等,稳定性更高 )
如果上述配置仍有问题,可额外添加一行强制指定OpenCV库路径优先级:
target_link_directories(ORB_SLAM PRIVATE BEFORE ${OpenCV_LIB_DIR})
方案2:重编译Open3D使用系统OpenCV(根治冲突)
如果后续要深度混用两个库的功能,建议直接编译自定义版本的Open3D,编译时添加以下CMake参数禁用内置OpenCV即可:
cmake .. \ -DBUILD_OPENCV=OFF \ -DOpen3D_FIND_SYSTEM_OPENCV=ON \ # 其他你需要的Open3D编译参数
编译安装后的Open3D会直接链接系统标准OpenCV,不会再出现符号冲突问题。
内容的提问来源于stack exchange,提问作者Max Crous
相关产品推荐
相关产品推荐

