1. 安装
在ubuntu系统下的安装命令如下:
sudo apt install cmake
查看cmake版本:
cmake -version
2. cmake的使用
- 为什么用cmake
理论上说,任意一个 C++ 程序都可以用 g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和里边的源文件,这时输入的编译命令将越来越长。如果仅靠 g++ 命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。在历史上工程师们曾使用 makefile 进行自动编译,但下面要谈的 cmake 比它更加方便。在一个 cmake 工程中,我们会用 cmake 命令生成一个 makefile 文件,然后,用 make命令,根据这个 makefile 文件的内容,编译整个工程。
- 使用步骤
在CMakeLists.txt同一目录下新建build目录,使用步骤类似于下列命令。
mkdir build
cd build
cmake .. # 在该目录下生成makefile文件
make -j4 # 编译
./YourExecutable #运行
上面的cmake后面接了两个点,表示CMakeLists.txt在上一个目录。也可以不添加build目录,CMakeLists.txt同一目录使用cmake .
进行编译,只不过生成的内容太多,影响美观。
这一步骤类似于使用源码安装软件,运行命令改为下列命令:
sudo make install
3. CMakeLists.txt的配置
每个 CMakeLists.txt 文件,告诉 cmake 我们要对这个目录下的文件做什么事情。CMakeLists.txt 文件内容需要遵守 cmake 的语法。主要包括基础配置、软件配置以及可执行文件配置
。
- 基础配置
cmake_minimum_required(VERSION 2.8)# # 声明要求的 cmake 最低版本
project(YourProjectName) # # 声明一个 cmake 工程
set(CMAKE_BUILD_TYPE Release) # 设置编译模式
set(CMAKE_CXX_FLAGS "-std=c++14 -O3") # C++支持的版本
set(OpenCV_DIR /opt/ros/kinetic/share/OpenCV-3.3.1-dev)#手动定义变量,find_package没找到的情况下可以使用
- 软件配置
#典型一般配置
include_directories(/usr/local/include)#找根目录
# OpenCV
find_package(OpenCV REQUIRED)#寻找OpenCV.CMakeLists,以此找到包,并赋值各库相关变量
include_directories(${OpenCV_INCLUDE_DIRS})#添加头文件搜索路径,这样可以在代码中的#include做根目录
target_link_libraries(${OpenCV_LIBS})
#OpenCV_INCLUDE_DIRS是关于find_package的变量
#如果要生成.so文件
find_package(OpenCV REQUIRED)
target_include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${OpenCV_LIBS})
# Ceres
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDE_DIRS})
# g2o
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})
# Eigen
include_directories("/usr/include/eigen3")
# pcl
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS}) #库地址
add_definitions(${PCL_DEFINITIONS})
- 添加可执行文件方式:
add_executable(gaussNewton gaussNewton.cpp)#添加对主函数的可执行文件
target_link_libraries(gaussNewton ${OpenCV_LIBS}) # 添加OpenCV的库,目标链接库
add_executable(ceresCurveFitting ceresCurveFitting.cpp)
target_link_libraries(ceresCurveFitting ${OpenCV_LIBS} ${CERES_LIBRARIES})
add_executable(g2oCurveFitting g2oCurveFitting.cpp)
target_link_libraries(g2oCurveFitting ${OpenCV_LIBS} ${G2O_CORE_LIBRARY} ${G2O_STUFF_LIBRARY})
add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
) #非main.cc,${PROJECT_NAME}表示该工程共享,非单独可执行文件独有。
参考文章:https://blog.youkuaiyun.com/whahu1989/article/details/82078563