我是靠谱客的博主 慈祥糖豆,这篇文章主要介绍SLAM 中 CMake 使用语法使用实例编译模式,现在分享给大家,希望可以做个参考。

文章目录

  • 语法
  • 使用实例
  • 编译模式

语法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//建议命令都使用大写 //cmake 的变量引用方式:使用 ${} 来引用变量 //清除编译中间文件时,最关键的是 CMakeCache.txt PROJECT(projectname [CXX] [C] [Java]) //定义工程名称,且隐式定义了两个cmake变量:PROJECT_BINARY_DIR ( = <projectname>_BINARY_DIR )、PROJECT_SOURCE_DIR ( = <projectname>_SOURCE_DIR ) //(内部编译:都指此命令所在CmakeLists.txt的路径(工程路径);外部编译:PROJECT_BINARY_DIR变为 cmake 编译路径(build文件夹下)),就避免了后期调用文件路径时使用一大串路径名的麻烦 SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) //显式的用 VALUE 代表后面的变量 MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" " " ...) //cmake 时,在终端中打印 “ ” 中的内容 //SEND_ERROR:产生错误,生成过程被跳过;SATUS:输出前缀为—的信息;FATAL_ERROR:立即终止cmake过程 ADD_EXECUTABLE(exename [*.cpp]) //用于含 main 的 .c 文件,生成名为 exename.exe 的可执行文件 ============================================================================================= PROJECT(HELLO) SET(SRC_LIST main.c) //SET(SRC_LIST "main.c") //如果文件名包含空格,就必须用双引号 //对多个源文件:SET(SRC_LIST t1.c t2.c) SET(SRC_LIST t1.c; t2.c) MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR}) //基本用不到 MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR}) ADD_EXECUTABLE(hello ${SRC_LIST}) //源文件列表 SRC_LIST 是在set()中指示的 .c .cpp 文件名 //ADD_EXECUTABLE(hello f1.c f2.c) ADD_EXECUTABLE(hello f1.c; f2.c) //后缀 .c 省略,但建议加上 ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) //source_dir:向工程添加子目录(.c文件目录);binary_dir:指定编译的中间、目标二进制结果存放的路径 //EXCLUDE_FROM_ALL:? //若不指定 binary_dir 目录,则编译结果都存在 build/source_dir 中,指定 binary_dir 目录,则存放在与 source_dir 同级的 binary_dir 目录 //重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 来指定最终的目标二进制的位置 (指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)?? SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) //外部编译时:可执行二进制(.exe)的输出路径为 PROJECT_BINARY_DIR/bin,bin文件夹自动生成 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) //库的输出路径为 PROJECT_BINARY_DIR/lib (似乎没有生成),lib文件夹自动生成 //要改变哪个CMakeLists.txt中的 ADD_EXECUTABLE 或 ADD_LIBRARY 的存放路径,就在哪里加入上述定义 ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 ... sourceN) //用于不含main的 .c 文件(编译成库,供含main的 .c 文件用TARGET_LINK_LIBRARIES调用 //不需要写全 libname.so,只需要填写 libname 即可,cmake 系统会自动生成libname.X,类型有三种: SHARED:创建共享动态库;STATIC:创建静态库 INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) //添加头文件(.h)路径,默认追加到当前头文件搜索路径后面, AFTER、BEFORE:控制头文件路径是追加还是置前 //INCLUDE_DIRECTORIES(/usr/include/hello) INCLUDE_DIRECTORIES(../include) TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...) //所有的 .c 文件都要链接:将 target 链接到共享库 library1 上,即将本 .c 文件与其使用的全部库文件链接起来(包含自己写的add_library()生成的库文件) //TARGET_LINK_LIBRARIES(main hello) //TARGET_LINK_LIBRARIES(main libhello.so) //得到了一个连接到 libhello 的可执行程序 main //TARGET_LINK_LIBRARIES(main libhello.a) //链接到静态库 =============================================================================================

使用实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
安装有两种:cmake后 make install 、打包时指定目录安装 make install:将 hello 安装到/usr/bin 、make install DESTDIR=/tmp/test 安装在/tmp/test/usr/bin 目录 LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib) //加入非标准的头文件搜索路径 INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include) //加入非标准的库文件(头文件)搜索路径 ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src) #增加子文件夹,也就是进入源代码文件夹继续构建 CMakeLists.txt :(包含 .c .cpp 的文件夹都需要) # 主文件夹下 cmake_minimum_required(VERSION 2.8) # 要求的 cmake 最低版本 project( < > ) set(CMAKE_BUILD_TYPE "Debug") #set( CMAKE_BUILD_TYPE "Release" ) set( CMAKE_CXX_FLAGS "-O3" ) set( CMAKE_CXX_FLAGS "-std=c++11") #设定编译器 SET(CMAKE_CXX_COMPILER "g++") SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) #SET(PROJECT_BINARY_DIR ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) #SET(PROJECT_BINARY_DIR ${PROJECT_BINARY_DIR}/lib) INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include ) #添加头文件路径(include中含有 .h 文件需要被引入) LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib) #未测试 ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src ) # 告知主文件夹下还有副文件夹(src中含有 .c 文件需要执行) # 含可执行文件的文件夹下的CmakeLists.txt add_executable(main main.cpp) # 当前文件夹下的可执行文件(即main函数文件,可有许多main文件) #add_library(hello_library libHelloSLAM.cpp) # 添加静态库(不含main的.cpp文件,同时,文件夹下有对应的.h文件) ##add_library(hello_library SHARED libHelloSLAM.cpp) # 添加共享库 #target_link_libraries(hello hello_library ${OpenCV_LIBS}) # 将库文件链接到可执行程序上(hello使用了shared内的函数) *******************************命令行、源码安装区别******************************** 命令行安装:稳定、比较旧、不需要处理依赖关系、安装的都是别人已经编译好的通用的二进制库,不能根据自己的需求进行调整 源码安装:占用较多的存储空间、可以下载最新版本或者指定的版本、可以根据自己的需求在编译时进行选择、可以查看甚至修改某个函数的源代码 *******************************OpenCV多版本安装******************************** OpenCV 3.2.0: sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev cmake .. // cmake default to a debug build. If you want to compile a release build with enhanced compiler optimizations, you can change the build target to “Release” with “-DCMAKE_BUILD_TYPE=Release”: cmake -DCMAKE_BUILD_TYPE=Release .. make -j2 sudo make install // sudo make -j2 install *******************************OpenCV多版本安装******************************** https://blog.csdn.net/heyijia0327/article/details/54575245 先安装3.1.0,后安装2.4.10:系统默认2.4.10 版本查看:pkg-config --modversion opencv 单个OpenCV安装方式: https://www.jianshu.com/p/f646448da265 多个安装方式: 安装第一个:https://www.jianshu.com/p/f646448da265 安装第二个:https://blog.csdn.net/ykwjt/article/details/90243698 ************************* #include <opencv2/opencv.hpp> #include <opencv2/core/eigen.hpp> find_package(OpenCV REQUIRED) #REQUIRED:如果对应的库找不到 则CMake配置的过程将完全失败 #include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(main ${OpenCV_LIBS}) ************************* ============================================================================================= Eigen:(下面链接使用的是3.3.5,自己装可改为最新版3.3.7) https://blog.csdn.net/xiangxianghehe/article/details/81236299 ************************* #include <Eigen/Core> #include <Eigen/Geometry> find_package(Eigen3 REQUIRED) include_directories( "/usr/local/include/eigen3" ) target_link_libraries(main ${EIGEN3_LIBS}) ************************* ============================================================================================= Sophus: https://github.com/strasdat/Sophus cmake .. ************************* #include "sophus/se3.h" #include "sophus/so3.h" include_directories( "/usr/local/include/eigen3" ) #find_package( Sophus REQUIRED ) include_directories( ${Sophus_INCLUDE_DIRS} )#添加头文件目录 add_executable( useSophus useSophus.cpp)#添加可执行文件 #target_link_libraries( useSophus ${Sophus_LIBRARIES} )#添加库文件目录 ************************* ============================================================================================= g2o: sudo apt-get install libsuitesparse-dev qtdeclarative5-dev qtdeclarative5-dev qtdeclarative5-dev cmake ************************* list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) #需要将文件FindG2O.cmake所在文件夹cmake放在目录下 find_package(G2O REQUIRED) #include_directories(${G2O_INCLUDE_DIRS}) target_link_libraries(main ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY}) ************************* ============================================================================================= PCL: (ubuntu16.04 20.04) 命令行安装:(高翔) sudo apt-get install libpcl-dev pcl-tools 源码安装:cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON -DCMAKE_INSTALL_PREFIX=/usr .. ************************* #include <pcl/io/pcd_io.h> //PCD读写类相关头文件 #include <pcl/point_types.h> //PCL中支持的点类型头文件 #include <pcl/common/transforms.h> FIND_PACKAGE(PCL REQUIRED) ADD_DEFINITIONS( ${PCL_DEFINITIONS} ) #INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS} ) #LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} ) #list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") # solve Bug in Ubuntu 16.04 TARGET_LINK_LIBRARIES(main ${PCL_LIBRARIES}) /* #因为PCL是模块化的,也可以如下操作: # 一个组件 find_package(PCL 1.6 REQUIRED COMPONENTS io) #多个组件 find_package(PCL 1.6 REQUIRED COMPONENTS commom io) #所有组件 find_package(PCL 1.6 REQUIRED ) */ #下面的语句是利用CMake的宏完成对PCL的头文件路径和链接路径变量的配置和添加,如果缺少下面几行,生成文件的过程中就会提示 #找不到相关的头文件,在配置CMake时,当找到了安装的PCL,下面相关的包含的头文件,链接库,路径变量就会自动设置 # PCL_FOUND:如果找到了就会被设置为1 ,否则就不设置 # PCL_INCLUDE_DIRS:被设置为PCL安装的头文件和依赖头文件的目录 # PCL_LIBRARIES:被设置成所建立和安装的PCL库头文件 # PCL_LIBRARIES_DIRS:被设置成PCL库和第三方依赖的头文件所在的目录 # PCL_VERSION:所找到的PCL的版本 # PCL_COMPONENTS:列出所有可用的组件 # PCL_DEFINITIONS:列出所需要的预处理器定义和编译器标志 ************************* 点云文件: .pcd;可视化:pcl_viewer map.pcd ============================================================================================= Pangolin: https://github.com/stevenlovegrove/Pangolin sudo apt-get install libglew-dev cmake libboost-dev libboost-thread-dev libboost-filesystem-dev cmake ************************* find_package( Pangolin REQUIRE) include_directories( ${Pangolin_INCLUDE_DIRS} ) target_link_libraries( main ${Pangolin_LIBRARIES} ) ************************* ============================================================================================= DBoW2 : (orb-slam中自动安装) https://github.com/dorian3d/DBoW2 DBoW3 https://github.com/rmsalinas/DBow3 ************************* ************************* ============================================================================================= Ceres:(还未测试) sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.4 libgflags-dev libgoogle-glog-dev libgtest-dev ************************* list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR} target_link_libraries( main ${CERES_LIBRARIES} )   #添加库文件目录 or: list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules ) find_package( Ceres REQUIRED ) include_directories( ${CERES_INCLUDE_DIRS}) target_link_libraries( main ${CERES_LIBRARIES} ) ************************* Meshlab:sudo apt-get install meshlab ************************* ============================================================================================= OctoMap: sudo apt-get install libqt4-dev qt4-qmake libqglviewer-dev cmake(无install) 测试:3rdparty/octomap-1.9.1/bin/octovis /home/fei/3rdparty/octomap-1.9.1/octomap/share/data/geb079.bt *************************(未测试) find_package(octomap REQUIRED) include_directories(${OCTOMAP_INCLUDE_DIRS}) add_executable(pointcloud_mapping pointcloud_mapping.cpp) target_link_libraries(pointcloud_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES}) add_executable(octomap_mapping octomap_mapping.cpp) target_link_libraries(octomap_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} ${OCTOMAP_LIBRARIES}) add_executable(surfel_mapping surfel_mapping.cpp) target_link_libraries(surfel_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES}) ************************* ============================================================================================= gflags: cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON -DINSTALL_HEADERS=ON -DINSTALL_SHARED_LIBS=ON -DINSTALL_STATIC_LIBS=ON .. ************************* find_package(GFlags REQUIRED) include_directories(${GFLAGS_INCLUDE_DIRS}) ************************* ============================================================================================= GTest: sudo apt-get install libgtest-dev cd /usr/src/gtest sudo cmake CMakeLists.txt sudo make #copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder sudo cp *.a /usr/lib ************************* find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) *************************

编译模式

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//build模式 mkdir build cd build cmake .. make //debug模式,可以进行gdb调试。调试版本,包含调试信息,并且不作任何优化,便于程序员调试程序 mkdir Debug cd Debug cmake -DCMAKE_BUILD_TYPE=Debug .. make //release模式。发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 mkdir Release cd Release cmake -DCMAKE_BUILD_TYPE=Release .. make

最后

以上就是慈祥糖豆最近收集整理的关于SLAM 中 CMake 使用语法使用实例编译模式的全部内容,更多相关SLAM内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部