1.cmake简介及安装
CMake简介
CMake是一个用于管理源代码的跨平台构建工具,可以方便地根据目标平台和编译工具产生对应的编译文件,如基于Linux系统生成对应的Makefile文件或Widows Virtual Studio生成project等。虽然最主要用于C/C++语言的构建,但是也可以用于其它编程语言的源代码。
如同使用make命令工具解析Makefile文件一样,cmake命令工具依赖于一个CMakeLists.txt的文件,该文件定义了代码的编译规则和目标等信息。
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
编写 CMake 配置文件 CMakeLists.txt 。
执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 。其中, PATH 是 CMakeLists.txt 所在的目录。
使用 make 命令进行编译。
安装CMake
下面以Ubuntu 16.04安装cmake为例。
使用命令在线安装
sudo apt-get install cmake
这种方式需要联网且安装的是链接库中的版本,可能不是最新或指定的cmake版本。
如果能联网且希望安装指定版本可以使用如下简单方法:
从官网上下载对应版本的.sh文件,如:cmake-3.17.2-Linux-x86_64.sh
运行该文件:
./cmake-3.17.2-Linux-x86_64.sh
根据提示输入对应命令即可完成安装。
使用源代码编译安装
- 下载源代码
从官网:https://cmake.org/download中下载适合的版本。
我这里下载的3.17.2版本
- 编译
#解压
tar xvf cmake-3.17.2.tar.gz
cd cmake-3.17.2
./boostrap
make -j32
- 安装
sudo make install
- 确认是否安装成功
cmake --version
注:不同平台可能会遇到依赖问题,相应解决即可。
2.编译可执行文件的简单sample
示例
编写测试源程序
#include <iostream>
using namespace std;
int main()
{
cout << "This is a cmake sample" << endl;
return 0;
}
编写CMakeLists.txt
#cmake最低版本要求
cmake_minimum_required (VERSION 3.5)
#项目信息
project (cmake_test)
#指定生成目标
add_executable (hello hello.cpp)
编写CMakeLists.txt文件,并保存在与main.cpp源文件同个目录下:
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
此时文件夹目录下有如下两个文件:CMakeLists.txt hello.cpp
编译
执行cmake .
@server:~/test/cmaketest$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/gupan/test/cmaketest
此时文件夹下面多了3个文件,分别是CMakeCache.txt,cmake_install.camke,Makefile。
和1个文件夹/CMakeFiles,里面有很多cmake相关的文件。Makefile就是cmake自动产生的下一步编译所需的编译规则文件。
执行make
使用 make 命令编译得可执行文件。
@server:~/test/cmaketest$ make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/hello.cpp.o
[100%] Linking CXX executable hello
[100%] Built target hello
此时文件夹下又多了一个可执行文件’hello’。
运行
@server:~/test/cmaketest$ ./hello
This is a cmake sample
命令解析
cmake_minimum_required
cmake_minimum_required是cmake的一个command,其设置项目的最低的cmake版本要求。如果实际环境的cmake版本小于该命令的设置,则报错。
这个命令通常是必要的,且在CMakeLists.txt文件的一开始就使用。(如果有多层目录,那么子目录下的文件可以不要)
用法如下:
cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
VERSION:关键字,必需且保持不变;
min : 指定的cmake最低版本,实际运行环境的cmake必须不小于这个版本,通常说明编译文件使用到了哪个版本的特性。
max : 可选,用于指定最高的cmake版本,如果设置,则必须不小于min且可能会影响cmake_policy的设置,此选项在3.12版本后才添加
min, max均遵循cmake的版本格式:major.minor[.patch[.tweak]]
FATAL_ERROR : 可选,在cmake2.6之后就不再使用,保留它仅仅为了兼容低版本的命令。
project
project命令设置项目的名称,并将其保存在变量PROJECT_NAME中。如果是顶层CMakeLists.txt,还将项目名称存储在变量CMAKE_PROJECT_NAME中。
后面就可以直接用{PROJECT_NAME}或{CMAKE_PROJECT_NAME}命令来获取项目名称。
这个命令在一个项目的CMakeLists.txt中也是必要的。
用法:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
PROJECT-NAME:项目名称
VERSION:如同软件版本号,说明项目版本,可选。如果使用,CMP0048必须设置为NEW,同时版本号会保存在以下变量中:
PROJECT_VERSION, PROJECT-NAME_VERSION
PROJECT_VERSION_MAJOR, PROJECT-NAME_VERSION_MAJOR
PROJECT_VERSION_MINOR, PROJECT-NAME_VERSION_MINOR
PROJECT_VERSION_PATCH, PROJECT-NAME_VERSION_PATCH
PROJECT_VERSION_TWEAK, PROJECT-NAME_VERSION_TWEAK
CMAKE_PROJECT_VERSION(仅在顶层有效)
DESCRIPTION:项目描述,通常比较短的字符串,不超过几个单词,可选。内容会保存在以下变量中:
PROJECT_DESCRIPTION, PROJECT-NAME_DESCRIPTION
CMAKE_PROJECT_DESCRIPTION (仅在顶层有效)
HOMEPAGE_URL:指定项目的URL主页,可选。保存在以下变量中:
PROJECT_HOMEPAGE_URL, PROJECT-NAME_HOMEPAGE_URL
CMAKE_PROJECT_HOMEPAGE_URL (仅在顶层有效)
LANGUAGES:选择构建项目所需的编程语言,可选。支持的语言包括C,CXX(即C ++),CUDA,OBJC(即Objective-C),OBJCXX,Fortran和ASM。如果未指定,则默认使用C和CXX。
add_executable
指定可执行文件名称和使用的源文件。
通常生成的可执行文件必须是全局唯一的,可以只是文件的逻辑名(如:test),也可以带有后缀(如:test.exe)。建议直接使用逻辑名,由cmake根据平台来自动补全,这样会提高代码的跨平台性能。
用法(1):
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
name:可执行文件名称
WIN32:目标平台属性,如果声明,则可执行文件是运行在32bits Windows平台的
MACOSX_BUNDLE:目标平台属性
EXCLUDE_FROM_ALL:目标平台属性
source1…:源文件名称(如果在其他目录下需指定路径)
用法(2):
add_executable(<name> IMPORTED [GLOBAL])
可行性文件引用了外部的可执行文件,不是很常用。(至少目前为止我没用过,且没见过哪个项目用过。)
用法(3):
add_executable(<name> ALIAS <targ