前言
研究生阶段开启SLAM的旅程,从此篇博文起会开启一个新的SLAM专题,用以记录入门过程中的问题解决以及笔记分享,内容大多会涉及应用,原理剖析有能力的话后续会添加进来。如有纰漏,敬请指正!
今天记录CMake的有关知识,这是读者在linux上运行cpp代码的必要一环。
一、几个最简单的案例入门
-
Hello Eigen教程
# 声明所需要的cmake的最低版本 cmake_minimum_required(VERSION 3.11) # 声明一个cmake工程 project(SLAMBook-Eigen) # 添加头文件库 include_directories("/usr/include/eigen3") # 添加一个可执行程序 add_executable(helloEigen eigenMatrix.cpp)
-
Hello PCL教程
# 指定最小的版本 cmake_minimum_required(VERSION 3.14) # 指定项目名称 project(pcl_module) # 找到pcl的指定库和文件位置 find_package(PCL REQUIRED) # 生成可执行文件 add_executable(pcl_module src/pcl_module.cpp) # 添加头文件库 include_directories( ${PCL_LIBRARIES} /usr/include/eigen3 ) # 链接三方库 target_link_libraries(pcl_module ${PCL_LIBRARIES} ) # eigen仅由头文件构成,不需要库文件
-
Hello Cmake教程
# demostrate the minimum version of cmake
cmake_minimum_required(VERSION 3.16)
# define the project name
project(HelloSLAM)
# generate library file
add_library(hello_shared SHARED libHelloSLAM.cpp)
# generate executable file
add_executable(main helloSLAM.cpp)
# link to library
target_link_libraries(main hello_shared)
二、Cmake书写语法
2.1 必备语句
-
cmake_minimum_required(VRESION 3.14)
用于指定cmake的版本,一般需要添加上
-
project(HelloSLAM)
用于指定项目名称(好像不是必须的,但是建议添加上)
-
add_executable(main helloSLAM.cpp)
用于生成可执行文件
main -> 所生成的可执行文件的名称 helloSLAM.cpp -> 代码编写的源文件
2.2 库包含、链接语句
-
三方module:
三方模块一般由两部分组成:头文件和库文件
- 头文件需要包含,使用命令
include_directories()
- 库文件需要链接,使用命令
target_link_libraries()
需要注意的小问题:
-
有些module仅由头文件构成,没有库文件,因此仅需要包含头文件,不需要链接库文件,SLAM中最典型Eigen,具体请参照Hello Eigen教程
include_directories("/usr/include/eigen3")
-
有时module的路径不容易寻找,或者每个使用者的安装位置不同,无法写死,于是出现
find_package
命令,具体参照Hello PCL教程find_package(PCL REQUIRED)
查找pcl模块路径,后续所有路径均使用${PCL_LIBRARIES}
代替此处还有几点需要强调一下:
- PCL模块不仅需要
include_directories()
,还需要target_link_libraries()
find_package()
命令查找模块时,名称暂时还不知道怎么确定,比如哪个大写,哪个小写等等(有知晓的同学可以告知一声)
- PCL模块不仅需要
- 头文件需要包含,使用命令
-
自己写的module:
自己写module需要包含若干个文件:
source.cpp module.h module.cpp
-
module.cpp 对应库文件,需要编译为库文件,供使用者调用
CPP中的库文件分为静态库和共享库两类
- 静态库:.a 作为后缀名,静态库每次被调用都会生成一个副本,使用
add_library(hello libHelloSLAM.cpp)
生成 - 共享库:.so 作为后缀名,共享库只会有一个副本,使用
add_library(hello_shared SHARED libhelloSLAM.cpp)
生成
库文件生成之后,需要使用
target_link_libraries()
将库文件连接至可执行文件上 - 静态库:.a 作为后缀名,静态库每次被调用都会生成一个副本,使用
-
module.h 对应头文件,指明库文件的用途
头文件需要使用
include_directories()
命令包含头文件路径几点需要说明的:
- 如果.h文件CMakeLists.txt同级目录,就可以不使用
include_directories()
命令进行包含 - 如果.h文件放置在当前目录下的include文件夹中,需要添加
include_directories(./include)
命令包含头文件
- 如果.h文件CMakeLists.txt同级目录,就可以不使用
-
三、有关于Cmake使用的几点说明:
-
CMakeLists.txt 书写路径以CMakeLists.txt 文件的同级目录为准
上述关于自定义.h的说明就是这个意思,源文件和其他文件也类似,假设你源文件放置在src目录,对应需要更改
-
关于build文件夹的说明:
利用cmake管理工程时,cmake会生成若干相关文件,发布代码时需要删除(与代码无法,使用者编译运行仅需txt文件即可),因此使用build文件夹与源代码隔离开,便于操作
mkdir ./build cd ./build cmake .. # ..进入上一级文件夹执行cmake命令 make ./executableFile
四、后记
此篇文章内容大多依赖于视觉SLAM14讲,介绍CMake的工程应用和简单语法,可以使读者在开始时能够成功调试自己编写的代码以及14讲中的代码,具有初步的开发能力,高阶的语法和使用后续会不断补充。