1.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 1.1 CMake 是什么:
(1).CMake是一个支持生成跨平台建构文件的工具
(2).CMake并不直接建构最终的软件,而是描述项目文件被编译的过程,生成标准的建构档(如 Unix 的 Makefile 或 VS 的 projects/workspaces),然后再以对应平台的建构方式使用。
1.2 CMake源文件:
(1).CMake编写的源⽂件以CMakeLists.txt 命名或以.cmake为扩展名
(2).CMake的源⽂件包括 命令和注释
(3).CMake源文件中所有有效的语句都是命令
可以是内置命令或者自定义的函数(function) 或 宏命令(macro)
(4).可以通过add_subdirectory()命令把子录的CMake源文件添加进来
1.3 CMake编译C/C++原理:
(1).CMake比Unix的make更为高级,使用起来要方便得多。
(2).终端cmake命令将CMakeLists.txt文件建构为make所需要的makefile文件,
最后用make命令编译源码生成可执行程序或共享库(so(shared object))
因此CMake在Linux终端执行步骤总的来说就两个:
1.cmake
2.make
(3).终端执行cmake后会生成很多编译中间文件以及makefile文件,
一般会新建一个build目录专门用来编译:
1.mkdir build
2.cd build
3.cmake ..
4.make
build的创建也可以在CMakeLists.txt中使用命令创建。
cmake指向CMakeLists.txt所在的目录,
cmake .. 表示当前CMakeLists.txt目录的上一级目录
对于一个庞大的工程,编写Makefile相当复杂,
有了CMake工具之后就可以读入所有源文件,自动生成Makefile等构建文件。
2.CMake注释:
1 | (1).单行注释:#注释内容 |
3.CMake变量:
1 | (1).CMake中所有的变量都是string类型。 |
4.CMake列表(LISTS)
1 | (1).列表也是字符串,可以把列表看做是一个特殊的变量,这个变量有多个值。 |
5.CMake中变量的作用域
1 | (1).全局层:cache变量,在整个项目范围可见, |
6.CMake流程控制
(1).操作符:
优先级: () > 一元 > 二元 > 逻辑
一元:
1 | EXIST:如果指定的文件或目录存在,则为true |
二元:
1 | EQUAL:相等(如果给定的字符串或变量的值是有效数字且等于右侧的数字,则为true) |
逻辑:
1 | NOT: ! 如果条件不为ture,,则为true |
变量值参考网址:http://t.csdn.cn/IfYPc
(2).布尔常量值:
(3).条件命令 if():
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 语法格式:
if (表达式)
COMMAND(ARGS...)
elseif(表达式)
COMMAND(ARGS...)
else(表达式)
COMMAND(ARGS...)
endif(表达式)
示例:
set(if_tap OFF)
set(elseif_tap ON)
if(${if_tap})
message("if")
elseif(${elseif_tap})
message("elseif")
else(${if_tap})
message("else")
endif(${if_tap})
elseif和else部分是可选的, 也可以使⽤多个elseif部分
缩进和空格对语句的解析没有影响
(4).循环命令 while():
语法格式:
while(表达式)
COMMAND(ARGS...)
endwhile(表达式)
示例:
set(a "")
while(NOT a STREQUAL "xxx")
set(a "${a}x")
message("a = ${a}")
endwhile()
break() 可以跳出整个循环
continue() 可以跳出当前循环
(5).循环遍历 foreach():
语法格式:
foreach(循环变量 参数1 参数2... 参数N)
COMMAND(ARGS...)
endforeach(循环变量)
遍历RANGE:
#循环范围从start到stop,循环增量为step
foreach(循环变量 RANGE start stop step)
COMMAND(ARGS...)
endforeach(循环变量)
遍历LISTS:
foreach(循环遍历 IN LISTS 列表)
COMMAND(ARGS...)
endforeach(循环变量)
示例:
foreach(item 1 2 3)
message("item = ${item}")
endforeach(item)
#RANGE:RANGE 4 表示从0到4
foreach(item RANGE 4)
message("item = ${item}")
endforeach(item)
#RANGE:打印 1 3 5
foreach(item RANGE 1 5 2)
message("item = ${item}")
endforeach(item)
#LISTS:
set(list_var 1 2 3)
foreach(item IN LISTS list_var)
message("item = ${item}")
endforeach(item)
foreach也支持 break() 和 continue() 命令跳出循环
7.CMake自定义函数命令
1 | 语法格式: |
8.CMake自定义宏命令
1 | 语法格式: |
9.CMake常用变量
1 | CMake预设了一些常用变量,这些变量通常会在编写CMakeLists.txt文件时使用到: |
10.CMake常用命令
1 | (1) project命令: |
NDK(Native Development Kit)是一个用于在Android平台上开发C/C++原生代码的工具集。在NDK中,静态库(Static Library)和动态库(Dynamic Library)是两种不同的库文件形式。
静态库(SHARED)是将代码和依赖的库函数编译链接成一个可执行文件时静态地被调用的库。它的特点是将所有代码和依赖性都包含在文件内部,使得可执行文件独立性强,不依赖于其他外部库。静态库在编译时会将所有函数和数据都复制到可执行文件中,因此可执行文件的大小会增加。每次更新或修改静态库中的代码时,都需要重新编译和链接可执行文件。
动态库(STATIC)是独立于可执行文件的共享库,它在程序运行时被动态加载和链接到内存中。动态库可以被多个可执行文件共享,从而提供了代码的重用性和节省了可执行文件的大小。当应用程序需要使用动态库时,操作系统会在运行时加载它们,以提供所需的函数和资源。这样可以在不重新编译和链接可执行文件的情况下更新和修改动态库。
总结:
1 | 1. 静态库在编译时将代码和依赖性复制到可执行文件中,使得可执行文件独立性强,但会增加可执行文件的大小。 |
后缀或格式在NDK中,静态库和动态库的文件后缀或格式通常使用以下常见的命名约定:
1 | 1. 静态库的文件后缀或格式可以是: |
CMakeLists.txt 文件详解
【1】 设置cmake最小版本
1 | # 设置cmake最小版本 |
【2】指定项目
1 | # 指定项目 |
【3】导入库目录
1 | # 导入头文件目录 |
相当于 -I,如果C/C++中没有指定头文件的具体路径,在cmake中用include_directories指定头文件的目录也是可以的。
【4】生成一个动态库
1 | # 生成一个动态库(windows:dll,android:so) |
add_library可以指定多个源码文件,但是如果文件比较多的话也是一件麻烦的事情。
这里有两种方法可以指定目录中所有的文件:
1 | # 指定一个或多个目录中所有对应的文件,并将名称保存到 DIR_SRCS 变量(可以指定多个目录) |
或者
1 | # 查找目录所有源文件 并将名称保存到 DIR_SRCS 变量 |
【5】引入其它cmakelist
1 | # 添加 child 子目录下的cmakelist |
【6】指定动态库或静态库路径,或预处理
有两种方法:
1 | # 设置一个变量 |
或者
1 | # 引入静态库或者动态库 |
【7】生成可执行文件,在Android上不适用
1 | # 生成可执行文件(生成exe文件, 在VS工具上可用) |
【8】查找一个ndk自带库
1 | # log-lib 是变量名称 log是动态库名称 将liblog.so或liblog.a的路径赋值给log-lib |
将日志库log的路径赋值到变量log-lib中。
【9】链接ndk自带的库
1 | # 链接ndk自带的库 |
【10】Cmake基本配置
1 | # 设置cmake最小版本 |