如何实现项目与依赖项目分别依赖不同版本OpenCV编译?CMake配置求助
解决方案
方案一:预编译DEP-PROJ,让PROJ直接使用已编译版本(推荐)
这个方法从根源避免PROJ重建DEP-PROJ,彻底隔离两个项目的依赖环境:
单独编译DEP-PROJ并生成可被查找的配置文件
- 在DEP-PROJ的
CMakeLists.txt末尾添加以下代码,用于生成CMake配置文件(方便PROJ查找):# 替换成你的DEP-PROJ实际目标名称(比如你的库或可执行文件名字) set(DEP_PROJ_TARGET_NAME "DEP-PROJ") include(GNUInstallDirs) # 安装目标文件 install(TARGETS ${DEP_PROJ_TARGET_NAME} EXPORT DEP-PROJTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) # 导出目标配置 install(EXPORT DEP-PROJTargets FILE DEP-PROJTargets.cmake NAMESPACE DEP-PROJ:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DEP-PROJ) # 生成Config文件模板 include(CMakePackageConfigHelpers) configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/DEP-PROJConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DEP-PROJ PATH_VARS CMAKE_INSTALL_INCLUDEDIR) # 安装Config文件 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DEP-PROJConfig.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DEP-PROJ) - 在DEP-PROJ根目录创建
Config.cmake.in文件,内容如下:@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/DEP-PROJTargets.cmake") check_required_components(DEP-PROJ) - 编译并安装DEP-PROJ到本地目录(无需安装到系统
/usr):cd DEP-PROJ mkdir build && cd build # 指定OpenCV3.4路径和本地安装目录 cmake -DOPENCV3_DIR=../opencv34/build -DCMAKE_INSTALL_PREFIX=../install .. make -j6 make install
- 在DEP-PROJ的
在PROJ中引用已编译的DEP-PROJ
- 修改PROJ的
CMakeLists.txt,替换原来的add_subdirectory(DEP-PROJ)为以下代码:# 指定DEP-PROJ的配置文件目录 set(DEP-PROJ_DIR "../DEP-PROJ/install/lib/cmake/DEP-PROJ" CACHE PATH "") # 查找已安装的DEP-PROJ find_package(DEP-PROJ REQUIRED) # 链接DEP-PROJ到PROJ目标 target_link_libraries(PROJ-target-name PRIVATE DEP-PROJ::DEP-PROJ) - 编译PROJ时指定OpenCV4.4路径即可:
cd PROJ mkdir build && cd build cmake -DOPENCV4_DIR=../opencv44/build .. make -j6
- 修改PROJ的
方案二:强制DEP-PROJ使用OpenCV3.4,不受PROJ环境影响
如果必须通过add_subdirectory让PROJ构建DEP-PROJ,可通过以下方式确保DEP-PROJ的依赖独立:
修改DEP-PROJ的CMakeLists.txt,强制锁定OpenCV3.4
将DEP-PROJ中查找OpenCV的代码修改为:# 强制查找OpenCV3.4,只在指定路径查找,忽略全局环境 find_package(OpenCV 3.4 EXACT REQUIRED PATHS ${OPENCV3_DIR} NO_DEFAULT_PATH)这样即使PROJ中设置了OpenCV4.4的路径,DEP-PROJ也会严格使用
OPENCV3_DIR指定的3.4版本。在PROJ中传递OpenCV3.4路径给DEP-PROJ
- 方法一:在PROJ的
CMakeLists.txt中添加:# 传递OPENCV3_DIR给子项目DEP-PROJ set(OPENCV3_DIR "../opencv34/build" CACHE PATH "Path to OpenCV 3.4 build" FORCE) add_subdirectory(DEP-PROJ) - 方法二:编译PROJ时通过命令行指定:
cd PROJ/build cmake -DOPENCV4_DIR=../opencv44/build -DOPENCV3_DIR=../opencv34/build .. make -j6
- 方法一:在PROJ的
关键注意点
- OpenCV3和OpenCV4的头文件结构不同:OpenCV3的
opencv/cv.h在OpenCV4中不存在,因此DEP-PROJ必须绑定OpenCV3.4,不能混用版本。 - 避免全局设置
OpenCV_DIR,而是针对不同项目使用各自的版本变量(如OPENCV3_DIR、OPENCV4_DIR)来隔离依赖。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

