CMake中find_package与add_submodule兼容问题(基于Boost依赖)
解决方案:纯CMake下兼容Git子模块的Boost与Colmap依赖配置
方案1:利用Boost官方CMake配置引导find_package
如果你的Boost版本≥1.70(官方从该版本开始提供完整CMake支持),可以通过以下步骤让Colmap的find_package(Boost)识别到子模块中的Boost:
- 在主CMakeLists.txt中先处理Boost子模块:
# 添加Boost子模块,启用其官方CMake配置 add_subdirectory(dependencies/boost EXCLUDE_FROM_ALL) # 设置Boost_ROOT为子模块根目录,强制find_package优先查找本地版本 set(Boost_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost") set(Boost_NO_SYSTEM_PATHS ON)
- 再引入Colmap子模块:
add_subdirectory(dependencies/colmap)
Boost的官方CMake配置会自动导出Boost::headers、Boost::filesystem等目标,Colmap的find_package(Boost)会直接识别这些已构建的目标,无需手动设置Boost_INCLUDE_DIR。
方案2:预编译Boost子模块到项目内目录
如果你的Boost版本较低(无官方CMake支持),可以手动编译并安装Boost到项目内目录,让Colmap的find_package无缝识别:
- 在主CMakeLists.txt中添加Boost编译与安装逻辑:
set(BOOST_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/boost_local_install") # 执行Boost的bootstrap脚本(Windows替换为bootstrap.bat) execute_process( COMMAND ./bootstrap.sh --prefix=${BOOST_INSTALL_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost RESULT_VARIABLE BOOST_BOOTSTRAP_RESULT ) if(NOT BOOST_BOOTSTRAP_RESULT EQUAL 0) message(FATAL_ERROR "Boost bootstrap failed") endif() # 将Boost安装到项目内目录 execute_process( COMMAND ./b2 install WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost RESULT_VARIABLE BOOST_INSTALL_RESULT ) if(NOT BOOST_INSTALL_RESULT EQUAL 0) message(FATAL_ERROR "Boost install failed") endif() # 引导Colmap找到本地安装的Boost set(Boost_ROOT ${BOOST_INSTALL_DIR}) set(Boost_NO_SYSTEM_PATHS ON)
- 随后引入Colmap子模块:
add_subdirectory(dependencies/colmap)
这种方式完全模拟系统安装的Boost环境,Colmap无需任何修改即可正常依赖,同时Boost仍以Git子模块形式保留在项目中。
方案3:通过CMAKE_PREFIX_PATH传递Boost路径
这是轻量型方案,无需修改Boost构建流程,只需在引入Colmap前将Boost子模块路径加入CMake搜索路径:
# 将Boost子模块根目录加入CMake全局搜索路径 list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/boost") set(Boost_NO_SYSTEM_PATHS ON) # 提前配置Boost目标(需填写Colmap依赖的具体组件,如filesystem、program_options等) find_package(Boost REQUIRED COMPONENTS filesystem program_options) # 引入Colmap子模块 add_subdirectory(dependencies/colmap)
注意:如果Boost子模块未预编译库文件,需先通过add_subdirectory(dependencies/boost)完成构建,再执行上述步骤。
内容的提问来源于stack exchange,提问作者Ediolot
相关产品推荐
相关产品推荐

