把所有cmake缓存集中到build目录,便于删除
1
2
3
4
|
mkdir build
cd build
cmake ..
make
|
命令不区分大小写,参数和变量区分大小写
CMake注释
单行注释:#注释内容
多行注释:可以使用括号来实现多行注释:
#[[多行注释
多行注释
多行注释]]
CMake变量
CMake中所有的变量都是string类型,可以使用set() 和 unset() 命令来声明或者移除一个变量
变量的引用:${变量名}
#声明变量 set(变量名 变量值)
set(var 123)
#引用变量 message命令打印
message(“var = ${var}")
CMake列表(lists)
列表也是字符串,可以把列表看做是一个特殊的变量,这个变量有多个值。
语法格式:
set(列表名 值1 值2 … 值n)
或
set(列表名 “值1;值2;…值n”)
列表的引用:
${列表名}
#声明列表 set set(列表名 值1 值2 … 值n) 或 set(列表名 “值1;值2;…值n”)
set(list_var 1 2 3 4 5)
#或者
set(list_var “1;2;3;4;5”)
#打印列表
message(“list_var = ${list_var}")
CMake流程控制
【操作符】
一元:EXIST, COMMAND, DEFINED
二元:EQUAL, LESS, LESS_EQUAL, GRATER, GRATER_EQUAL, STR… VERSION… MATCHES
逻辑:NOT, AND, OR
【布尔常量值】
true: 1, ON, YES, TRUE, Y, 非0的值
false: 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, 空字符串, 以NOTFOUND结尾的字符串
【条件命令】
1
2
3
4
5
6
7
|
if (表达式)
COMMAND(ARGS...)
elseif(表达式)
COMMAND(ARGS...)
else(表达式)
COMMAND(ARGS...)
endif(表达式)
|
【循环命令】
1
2
3
|
while(表达式)
COMMAND(ARGS...)
endwhile(表达式)
|
break() 命令可以跳出整个循环, continue() 可以跳出当前循环。
【循环遍历】
foreach(循环变量 参数1 参数2… 参数N)
COMMAND(ARGS…)
endforeach(循环变量)
每次迭代设置循环遍历为参数。
foreach也支持 break() 和 continue() 命令跳出循环。
RANGE 4 表示0到4
1
2
3
|
foreach(item RANGE 4)
message("item = ${item}")
endforeach(item)
|
循环范围从 start 到 stop, 循环增量为step
1
2
3
4
5
6
7
8
9
|
foreach(循环变量 RANGE start stop step)
COMMAND(ARGS...)
endforeach(循环变量)
foreach支持对列表的循环
foreach(循环遍历 IN LISTS 列表)
COMMAND(ARGS...)
endforeach(循环变量)
|
CMake自定义函数命令
1
2
3
4
5
|
function(<name>[arg1 [arg3 [arg3...]]])
COMMAND(ARGS...)
endfunction(<name>)
函数命令调用格式
name(参数列表)
|
CMake自定义宏命令
1
2
3
4
5
6
|
macro(<name>[arg1 [arg3 [arg3...]]])
COMMAND(ARGS...)
endmacro(<name>)
宏定义调用格式
name(实参列表)
函数命令有自己的作用域,宏的作用域和调用者的作用域是一样的。
|
CMake中变量的作用域
全局层:cache变量,在整个项目范围可见,一般在set定义变量式,指定CACHE参数就能定义cache变量。
目录层:在当前目录CMakeLists.txt中定义,以及在该文件包含的其他Cmake源文件中定义的变量。
函数层:在命令函数中定义的变量,属于函数作用域内的变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
##myprint
#指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.11)
#给项目命名
PROJECT(MYPRINT)
#收集c/c++文件并赋值给变量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表区当前项目录
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)
FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/src/*.c)
#指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
#指定生成库文件的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#去变量SRC_LIST_CPP 与SRC_LIST_C 指定生成libmyprint 动态库 默认生成静态库 SHARED指定生成库类型为动态库
ADD_LIBRARY(myprint SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
##hello
#指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.11)
#指定项目名称
PROJECT(HELLO)
#将hello.cpp 赋值给SOURCE 变量
SET(SOURCE ${PROJECT_SOURCE_DIR}/src/hello.cpp)
#指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/../test/include)
#指定链接库文件目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/../test/lib)
#指定hello 链接库myprint
TARGET_LINK_LIBRARIES(hello myprint)
#将hello.cpp生成可执行文件hello
ADD_EXECUTABLE(hello ${SOURCE})
|