1. 说明
本篇将以一个极简的hello程序说明CMakeLists.txt的基本用法。
2. 示例
2.1 编写测试源程序
//hello.cpp
#include <iostream>
int main()
{
std::cout << "Hello, this is my first cmake sample" << std::endl;
return 0;
}
2.2 编写CMakeLists.txt
#CMakeLists.txt
cmake_minimum_required (VERSION 3.0.0)
project (cmake_test VERSION 0.0.1)
add_executable (test hello.cpp)
2.3 编译
$cmake .
-- The C compiler identification is GNU 5.5.0
-- The CXX compiler identification is Clang 3.8.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/clang++
-- Check for working CXX compiler: /usr/bin/clang++ - 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/xxx/cmake
运行上述命令后会在当前目录下生成一系列cmake*文件和一个Makefile文件,这个Makefile就是cmake自动产生的下一步编译所需的编译规则文件。
$make
Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/hello.cpp.o
[100%] Linking CXX executable test
[100%] Built target test
编译完成,从log信息中可以看出生成可执行的目标文件test
2.4 运行
$./test
Hello, this is my first cmake sample
3. 命令解析
3.1 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之后就不再使用,保留它仅仅为了兼容低版本的命令。
3.2 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。
3.3 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 <target>)
创建一个别名目标,以便name可用于在后续命令中引用target。 name不会作为生成目标出现在生成的构建系统中。target可能不是非全局导入的目标或ALIAS。