Bootstrap

SLAM 项目中的 CMakeLists.txt 详解:以 ORB-SLAM3 为例

在 C++ 开发 SLAM(Simultaneous Localization and Mapping,即同步定位与建图)系统时,CMake 是必不可少的工具之一。它用于管理项目的编译、依赖关系和库链接。本文以 ORB-SLAM3 为例,详细解析其 CMakeLists.txt,帮助开发者理解各个指令的作用,以及如何组织一个完整的 C++ SLAM 项目。

导入:

CMakeLists.txt文件定义了项目的编译配置、依赖项管理、库链接等关键步骤。本文将详细解析 ORB-SLAM3 的 CMakeLists.txt 文件,帮助开发者理解其构建流程,并掌握 CMake 的高级用法。

1. CMake 基本设置

首先,定义了 CMake 的最低版本要求,并设定了项目名称:

cmake_minimum_required(VERSION 2.8)
project(ORB_SLAM3)
  • cmake_minimum_required(VERSION 2.8): 指定最低 CMake 版本为 2.8,确保兼容性。

  • project(ORB_SLAM3): 定义项目名称 ORB_SLAM3,后续 CMake 变量会自动继承该名称。

2. 编译模式与优化选项

CMake 允许使用不同的编译模式,如 Debug 和 Release,本项目默认采用 Release 模式:

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release)
ENDIF()

如果用户没有指定 CMAKE_BUILD_TYPE,则默认采用 Release 模式。

2.1 编译优化标志

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall   -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -march=native")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native")
  • -Wall:开启所有常见的编译警告,提高代码质量。
  • -O3:启用最高级别的优化,使代码运行更快。
  • -march=native:针对本机 CPU 进行优化,以提高执行效率。

2.2 C++ 标准设置

set(CMAKE_CXX_STANDARD 14)
add_definitions(-DCOMPILEDWITHC11)
  • set(CMAKE_CXX_STANDARD 14): 指定 C++14 作为编译标准。
  • add_definitions(-DCOMPILEDWITHC11): 添加宏定义,可能用于代码中的条件编译。

 3. 查找依赖库

ORB-SLAM3 依赖多个外部库,如 OpenCV、Eigen、Pangolin 等,CMake 需要查找并引入这些库。

 3.1 OpenCV 依赖

find_package(OpenCV REQUIRED)
if(NOT OpenCV_FOUND)
    message(FATAL_ERROR "OpenCV > 4.4 not found.")
endif()

MESSAGE("OPENCV VERSION:")
MESSAGE(${OpenCV_VERSION})
  • find_package(OpenCV REQUIRED): 查找 OpenCV 库,如果找不到则终止编译。
  • message(FATAL_ERROR "OpenCV > 4.4 not found."):如果 OpenCV 版本低于 4.4,则报错终止。
  • MESSAGE(${OpenCV_VERSION}):输出 OpenCV 版本,便于调试。 

3.2 其他依赖

include_directories("/usr/include/eigen3")
find_package(Pangolin REQUIRED)
find_package(realsense2)
find_package(GUROBI REQUIRED)
  • include_directories("/usr/include/eigen3"): 直接指定 Eigen3 头文件路径(无需 find_package)。
  • find_package(Pangolin REQUIRED): 查找 Pangolin 视觉渲染库。
  • find_package(realsense2): 查找 RealSense 相机 SDK。
  • find_package(GUROBI REQUIRED): 查找 GUROBI 求解器。

4. 头文件路径配置

为了保证源码能够正确引用头文件,需要添加头文件目录:

include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
${PROJECT_SOURCE_DIR}/Thirdparty/Sophus
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
${GUROBI_INCLUDE_DIRS}
)
  • PROJECT_SOURCE_DIR 代表项目的根目录。
  • 头文件路径包括:
    • include/ 目录
    • include/CameraModels/ 目录
    • Thirdparty/Sophus(Sophus 是一个几何库)

5. 生成库文件

5.1 设定库文件输出路径

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

指定 lib 目录存放生成的 .so 共享库。

5.2 生成共享库

add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
...
include/Settings.h
include/MapSparsification.h)

add_library(${PROJECT_NAME} SHARED ...):将多个源文件编译为共享库 libORB_SLAM3.so,供其他程序调用。

6. 依赖库链接

target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${GUROBI_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
-lboost_serialization
-lcrypto
)
  • 这里链接了 OpenCV、Eigen、Pangolin、GUROBI 等库。
  • libDBoW2.solibg2o.so 分别是词袋模型(DBoW2)和 g2o(图优化)库。
  • -lboost_serialization-lcrypto:额外链接 Boost 和加密库。

 7. 处理 RealSense 相机

如果检测到 RealSense 依赖,则包含其头文件并链接库:

if(realsense2_FOUND)
    include_directories(${PROJECT_NAME} ${realsense_INCLUDE_DIR})
    target_link_libraries(${PROJECT_NAME} ${realsense2_LIBRARY})
endif()

8. 编译示例程序

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/Stereo)

add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc)
target_link_libraries(stereo_kitti ${PROJECT_NAME})

add_executable(stereo_euroc Examples/Stereo/stereo_euroc.cc)
target_link_libraries(stereo_euroc ${PROJECT_NAME})
  • add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc):编译 stereo_kitti 可执行文件。
  • target_link_libraries(stereo_kitti ${PROJECT_NAME}):链接 ORB-SLAM3 共享库

10.总结

本篇文章解析了 ORB-SLAM3 的 CMakeLists.txt 文件,涵盖了:

  1. CMake 基础配置

  2. 编译优化选项

  3. 依赖库查找与管理

  4. 头文件路径配置

  5. 共享库生成与链接

  6. RealSense 处理

  7. 示例程序编译

理解这些 CMake 指令,有助于开发者更好地修改、扩展 ORB-SLAM3,或在自己的项目中借鉴相关配置。

;