基础部分
前言
ORBSLAM2和ORBSLAM3注释版github链接https://github.com/electech6
SLAM基础
由于已经看过SLAM14讲,故删繁就简,看一部份
CMAKE相关
指令
常用的比较重要的指令
# 指定要求最小的CMake版本,
cmake_minimum_required(VERSION 3.10)
# 设置当前项目名称
project(test)
# 指定头文件搜索路径,方便编译器找到头文件
include_directories(
)
# 设置用变量替换值
set(variable value)
# 用指定的源文件为工程添加可执行文件
add_executable(hello main.cpp)
# 将指定的源文件生成链接库文件, STATIC表示静态链接库, SHARED表示动态链接库
add_library(libname STATIC/SHARED sources)
# 为库或二进制文件添加链接库
target_link_libraries(target library1 library2...)
# 向当前工程中添加文件的子目录,目录可以是相对路径或绝对路径
add_subdirectory(source_dir)
# 遍历目录下的所有源文件
aux_source_directory(dir varname)
# 打印信息
message(mode "message text")
# mode 包括 STATUS、WARNING、ERROR、FATAL_ERROR、SEND_ERROR、
# 搜索第三方库
find_package(packageName version EXACT/QUIET/REQUIRED)
# 后面是三个参数,EXACT表示精确匹配,QUIET表示不输出任何信息,REQUIRED表示如果没有找到,则报错
# 当find_package 找到一个库时,以下变量会自动初始化,NAME 表示库的名字
# <NAME>_FOUND 显示是否找到库的标记
# <NAME>_INCLUDE_DIRS 包含库的头文件路径 或 <NAME>_INCLUDES
# <NAME>_LIBRARIES 包含库的链接库路径 或 <NAME>_LIBS
# 列表操作(读,搜索,修改,排序)
list()
# 追加例子:LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# 条件语句
if elseif endif
# 循环语句
foreach() endforeach()
Cmake 中一些常用的、预定义的变量如下
PROJECT_NAME: 工程名称,替代project(name)中的name
PROJECT_SOURCE_DIR: 工程路径,通常是包含project指令的CMakeLists.txt文件所在的路径
EXECUTABLE_OUTPUT_PATH:可执行文件输出路径
LIBRARY_OUTPUT_PATH: 库文件输出路径
CMAKE_BINARY_DIR: 默认是 build 文件夹所在的绝对路径
CMAKE_SOURCE_DIR: 源文件所在的绝对路径
使用find_package
指令,自动查询package安装位置,方便别人移植。
#在使用 find_package 指令的情况下自动指定路径
#,查找计算机中已经安装的 Pangolin 库
find_package(Pangolin REOUIRED)
#自动将找到的 Pangolin 库中头文件的路径添加到工程中include_directories(S{Pangolin_INCLUDE_DIRS})
include_directories(S{Pangolin_INCLUDE_DIRS})
#自动将找到的 Pangolin 库文件链接到工程中target_link_libraries(mydemo ${Pangolin_LIBRARIES} )
target_link_libraries(mydemo ${Pangolin_LIBRARIES} )
注意事项
- CMake 指令不区分大小写
- 参数和变量名称,,严格区分大小写,引用变量的形式为${ }。
- 可以这样搞,
set
命名一变量,包含多个路径。然后target_link_libraries
直接link这里
- 可以这样搞,
管理方法
两种方法管理
- 工程存在多个目录,只使用一个
CMakeLists.txt
文件来管理- 中央集权型,
- 工程存在多个目录,每一个源文件目录都使用一个
CMakeLists.txt
文件来管理- 区域自治型,