CMake无法找到G2O包及头文件的编译问题排查
解决g2o头文件找不到的CMake配置问题
项目结构
scan_inconsistency |-- CMakeLists.txt |-- build |-- cmake_modules |-- libs | |-- CMakeLists.txt | |-- consist | `-- g2o `-- src |-- CMakeLists.txt `-- main.cpp
背景与问题
consist包已完成Qt5适配、Eigen路径调整等修改,g2o是consist的依赖,cmake_modules目录复制自consist/cmake并修改。编译时遇到两个问题:
- 单独编译consist时,make阶段提示找不到
g2o/core/sparse_optimizer.h - 编译顶层CMakeLists.txt时,make阶段提示找不到
g2o/core/optimizable_graph.h
CMakeLists调整方案
1. 顶层CMakeLists.txt修改
确保自定义cmake模块路径被识别,提前查找g2o并全局传递依赖信息:
cmake_minimum_required(VERSION 3.10) project(scan_inconsistency) # 将自定义cmake_modules加入模块搜索路径 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake_modules) # 查找g2o依赖,全局设置头文件和库路径 find_package(G2O REQUIRED) include_directories(${G2O_INCLUDE_DIR}) link_directories(${G2O_LIBRARY_DIR}) # 编译子项目 add_subdirectory(libs) add_subdirectory(src)
2. libs/CMakeLists.txt修改
调整编译顺序,保证g2o先编译完成,同时给consist明确传递g2o依赖:
# 优先编译g2o子项目 add_subdirectory(g2o) # 编译consist add_subdirectory(consist) # 给consist添加g2o头文件路径 target_include_directories(consist PUBLIC ${G2O_INCLUDE_DIR}) # 将g2o库链接到consist target_link_libraries(consist PUBLIC ${G2O_LIBRARIES})
3. src/CMakeLists.txt修改
确保主程序能继承consist的g2o依赖,必要时显式添加头文件路径:
add_executable(scan_inconsistency main.cpp) # 链接consist库,自动继承其g2o依赖 target_link_libraries(scan_inconsistency PRIVATE consist) # 若仍存在头文件找不到问题,显式添加g2o头文件路径 target_include_directories(scan_inconsistency PRIVATE ${G2O_INCLUDE_DIR})
4. 单独编译consist的补充配置
如果需要单独编译consist,需在consist/CMakeLists.txt中添加g2o的查找逻辑:
# 加入g2o查找 find_package(G2O REQUIRED) include_directories(${G2O_INCLUDE_DIR})
额外检查点
- 确认
cmake_modules/FindG2O.cmake配置正确,能正确识别g2o的include和lib目录 - 确保g2o已正确编译,其头文件和库文件路径与CMake查找结果一致
内容的提问来源于stack exchange,提问作者Shrinivas Iyengar
相关产品推荐
相关产品推荐

