CMake初步使用

CMake是什么

官方说明:

CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice.

简单来说就是,CMake一个能够跨平台、跨编译器的编译和管理里的项目的工具集。在我目前使用过程中,最直观的感受是:通过执行cmake,它能够根据比较简单的配置文件,自动生成各种makefile或者工程的文件,而不必自己写复杂的makefile文件了。

CMake的简单使用

1. 生成CMakeLists.txt

要使用CMake首先就是需要写一个CMakeLists.txt文件了,CMakeLists.txt文件是CMake管理工程的配置文件。你对工程的所有的管理和配置都需要在CMakeLists.txt文件申明。

CMakeLists.txt就像一个简单的脚本语言一样,它也有自己的语法。它有if条件控制语句,也有foreach循环控制语句,还有 NOT、AND、OR关系运算语句,输出信息可以用message。在CMakeLists.txt中是对大小写不敏感的,你可以用大写,也可以用小写,也可以混写。具体语言使用参考官方文档:https://cmake.org/documentation/

当有CMakeLists.txt后,就可以按照以下命令执行cmake和编译的操作了:

1
2
cmake ..
make
2. 编译个一个典型的工程

在工程目录下,分文件夹来管理不同类型的文件,目录结构如下:

工程目录结构

那么我们可以将如下声明写入CMakeLists.txt中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #设定版本
PROJECT( slam ) #设定工程名
SET( CMAKE_CXX_COMPILER "g++") #设定编译器

#设定可执行二进制文件的目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

#设定存放编译出来的库文件的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)

#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)

#增加子文件夹,也就是进入源代码文件夹继续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

以上每一条声明都有注释有说明,当CMake读到最后ADD_SUBDIRECTORY时会,指定的进入/src子目录中,这时候我们需要在这个子目录中也要添加一个CMakeLists.txt提供CMake继续执行。

假定/src目录下只有一个main.cpp的源文件,在其中的CMakeList.txt中就可以只需指定编译的源文件即可:

1
2
# 增加一个可执行的二进制
ADD_EXECUTABLE( main main.cpp )
3. 使用选项进行条件控制

使用option的声明一个选项,如下所示:

1
2
3
4
5
6
7
option (USE_MYMATH "Use tutorial provided math implementation" ON)

if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

option选项会显示在CMake的GUI,并且其默认值为ON。需要执行cmake-gui代替cmake(需要安装cmake-qt-gui)。当用户选择了之后,这个值会被保存在CACHE中,这样就不需要每次CMAKE都进行更改了。后面用if语句检查USE_MYMATH选项开决定是否执行下面的声明语句。

4. 添加第三方库的支持

以添加OpenCV和PCL库为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 增加PCL库的依赖
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io )

# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 添加头文件和库文件
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS} )
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

TARGET_LINK_LIBRARIES( generate_pointcloud ${OpenCV_LIBS}
${PCL_LIBRARIES} )

添加库最常用的命令就是find_package命令了,它可以被用来在系统中自动查找配置构建工程所需的程序库。在linux和unix类系统下这个命令尤其有用。CMake自带的模块文件里有大半是对各种常见开源库的find_package支持,支持库的种类非常多。REQUIRED表示如果没有找到,cmake会停止处理,并报告一个错误。最后使用TARGET_LINK_LIBRARIES高速程序需要连接的库。

Compartir