类Unix的操作系统中,使用CMake步骤分为:
1)编写 CMakeLists.txt 配置文件;
2)执行 cmake 命令生成 makefile 文件;
3)执行 make 命令,编译链接生成最终的目标文件。
CMake命令行格式:
1) cmake <options> [<path-to-source> or <path-to-existing-build>]
其中,<options>为可选项;
<path-to-source> 表示 CMakeLists.txt 文件所在的路径;
<path-to-existing-build> 表示 一个已存在的构建工程所在的路径。
常用的option有:
-G <generation-name>
指定构建系统生成器;例如: cmake -G "Visual Studio 11 2012" E:\workplace\cmake, 生成 VS2012 的构建工程
-D <var>:<type>=<value>,-D <var>=<value>
添加变量及其值到 CMakeCache.txt 文件中,以便在 CMakeLists.txt文件中使用该变量;
-U <globbing_expr>
从 CMakeCache.txt 文件中 删除一个或多个变量
-E
使用 CMake 的命令行模式
CMakeLists.txt的编写:
1)CMake的语法
CMakeLists.txt 文件中的命令格式:
commad (args...)
其中, commad,是命令
args,是命令的参数,参数之间用 空格 间隔。
2)常用命令
cmake_minimum_required
设置项目要求的CMake最低版本号。 一般放在 CMakeLists.txt 文件开头。
命令格式:
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
add_custom_command:
为生成的构建系统添加一条自定义的构建规则。
该命令具有两种使用形式:
1> 通过自定义命令在构建中生成输出文件;命令格式为:
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[VERBATIM] [APPEND] [USES_TERMINAL])
其中:
OUTPUT:
指定命令预期产生的输出文件。 如果输出文件的名称是相对路径,即相对于当前的构建的源目录路径。
COMMAND:
指定要在构建时执行的命令行。 多个COMMAND,按顺序执行。
MAIN_DEPENDENCY:
可选命令,指定命令的主要输入源文件
DEPENDS:
指定命令所依赖的文件
BYPRODUCTS:
可选命令,指定命令预期产生的文件
IMPLICIT_DEPENDS:
可选命令。 请求扫描输入文件的隐式依赖关系。 仅支持 makefile 生成器
WORKING_DERECTORY:
可选命令,使用给定的工作目录执行命令
COMMENT:
可选命令,在构建时执行命令之间显示给定消息
DEPFILE:
可选命令,为Ninja 生成器制定一个 .d depfile。对其他生成器,使用 DEPFILE 会导致错误。
2> 向构建目标添加自定义命令
命令格式:
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL])
参数介绍:
TARGET:
定义了与构建指定<target>相关联的信命了。 当<target>已经存在时,相应的command将不再执行
PRE_BUILD:
在目标中执行任何其他规则之间运行。 仅支持 Visual Studio 7及以上的生成器;其他生成器下, PRE_BUILD将被视为 PRE_LINK
PRE_LINK:
在编译源之后运行,但在链接二进制文件或运行静态库的库管理器或存档器工具之间运行
POST_BUILD:
在目标中的所有其他规则都已执行后运行。
add_custom_target
给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。
命令格式如下:
add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL]
[SOURCES src1 [src2...]])
参数:
Name:
指定目标的名称。
ALL:
表明此目标应添加到默认构建目标,以便每次都将被执行(该命令名称不能为ALL)
SOURCES:
指定要包括在自定义目标中的其他源文件。指定的源文件将被添加到 IDE 的项目文件中,以方便编译,即使它们没有构建规则。
add_definitions:
为源文件的编译添加由 -D 引入的宏定义。 命令格式如下:
add_definitions(-DFOO -DBAR ...)
add_dependencies:
使顶级目标依赖于其他顶级目标,以确保这些顶级目标在目标之间构建。
这些顶级目标是由 add_executable, add_library 或 add_custom_target 命令之一创建的目标。
add_executable:
使用指定的源文件,给项目添加一个可执行文件。
命令格式:
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
参数:
name:
要构建的可执行目标的名称。 <name> 对应于逻辑目标名称,在项目中必须是全局唯一的。
WIN32:
可选参数。 在创建的目标上设置属性 WIN32_EXECUTABLE
MACOSX_BUNDLE:
可选参数。 将在创建的目标上设置相应的属性
EXCLUDE_FROM_ALL:
可选参数。 将在创建的目标上设置相应的属性
source
源文件列表
add_library:
使用指定的源文件给项目添加一个库。
命令格式:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
参数:
name:
指定构建的库目标名称,该名称必须在项目中全局唯一
STATIC:
静态库
SHARED:
动态链接库
MODULE:
不会被链接到其它目标中,但可以在运行时使用 dlopen-系列的函数动态链接。
add_sundirectory:
向构建中添加子目录。
命令格式:
add_subdirectory(source_dir [binary_dir]
[EXCLUDE_FROM_ALL])
aux_source_directory:
查找指定目录中的所有源文件的名称,并将名称列表存储在一个 variable 中。
命令格式:
aux_source_directory(<dir> <variable>)
configure_file:
将文件复制到其他位置并修改其内容。
命令格式:
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
find_file:
查找一个文件的完整路径。
命令格式:
find_file(<VAR> name1 [path1 path2 ...])
find_library:
查找一个库文件。
命令格式:
find_library(<VAR> name1 [path1 path2 ...])
find_package:
查找并加载外部项目的设置。
命令格式:
find_package(<package> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
find_path:
查找包含某个文件的路径。
find_path(<VAR> name1 [path1 path2 ...])
include_directories:
将给定的目录添加到编译器,用于搜索包含文件的目录。
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
include:
包含其他目录的CMakeLists.txt文件
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
[NO_POLICY_SCOPE])
link_directories:
指定链接器查找库的路径。
link_directories(directory1 directory2 ...)
message:
向用户显示信息。
message([<mode>] "message to display" ...)
参数:
mode:
可选的值为none,STATUS,WARNING,AUTHOR_WARNING,SEND_ERROR,FATAL_ERROR,DEPRECATION。
project:
为整个工程设置一个工程名。
project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[LANGUAGES <language-name>...])
set:
将一个CMake变量设置为给定值
set(<variable> <value>... [PARENT_SCOPE])
set_target_properties:
设置目标的一些属性来改变它们构建的方式。
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
target_link_libraries:
将给定的库链接到一个目标上
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
target_include_directories:
指定编译<target>时使用的文件包含路径。<target> 必须已由命令 add_executable() 或 add_library() 创建,且不能是一个 ALIAS target。
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
target_compile_definitions:
指定编译 <target>时的编译选项。
target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
check_cxx_compiler_flag:
校验CXX编译器是否支持指定的<flag>,并把结果存入内部缓存变量<var>中;
需先调用命令 include(CheckCXXCompilerFlag)。
check_cxx_compiler_flag(<flag> <var>)
3)常用的变量:
CMAKE_BINARY_DIR # 构件树的顶层目录
CMAKE_COMMAND # 指向CMake可执行文件的完整路径
CMAKE_CURRENT_BINARY_DIR # 当前正在被处理的二进制目录的路径
CMAKE_CURRENT_SOURCE_DIR # 当前正在被处理的源码目录的路径
CMAKE_HOME_DIRECTORY # 源码树顶层的路径
CMAKE_PROJECT_NAME # 工程名
CMAKE_ROOT # CMake的安装路径
CMAKE_SOURCE_DIR # 源码树的顶层路径
CMAKE_VERSION # CMake的完整版本号
PROJECT_BINARY_DIR # 当前编译工程构建的全路径
<PROJECT-NAME>_BINARY_DIR # 当前编译工程构建的全路径
<PROJECT-NAME>_SOURCE_DIR # 构建工程的全路径
PROJECT_SOURCE_DIR # 构建工程的全路径
PROJECT_NAME # project 命令传递的工程名参数
<PROJECT-NAME>_VERSION # 项目的完整版本号
其中的<PROJECT-NAME>,由命令 project 设置。