在 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.so
和libg2o.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
文件,涵盖了:
-
CMake 基础配置
-
编译优化选项
-
依赖库查找与管理
-
头文件路径配置
-
共享库生成与链接
-
RealSense 处理
-
示例程序编译
理解这些 CMake 指令,有助于开发者更好地修改、扩展 ORB-SLAM3,或在自己的项目中借鉴相关配置。