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

概述

文章目录

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

语法


//建议命令都使用大写 //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) //链接到静态库
=============================================================================================

使用实例

安装有两种: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})
*************************

编译模式

//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 中 CMake 使用语法使用实例编译模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部