1.makefile、cmake 与 shell 之间的联系
makefile : 帮助我们管理编译项目
cmake:是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的 Makefile 或者 project 文件,CMake 并不直接建构出最终的软件,而是产生标准的建构档(如 Makefile 或 projects)。
shell 脚本:一系列命令和语法
2.makefile 自动编译和链接
2.1 gcc 如何编译相互依赖,却没直接引入的文件
Android.mk Application.mk
gcc hello.cpp div.cpp sub.cpp add.cpp -o hello
// hello.cpp 中并没引入 div.cpp等文件,但是这样编译会自动找寻到依赖的文件
gcc 四步骤:生成 .o 文件比较耗时(汇编阶段
)
上面的编译步骤其实就是省略了编译四步骤,假设现在我改了一个文件,需要重新编译,那么每次都会重新生成 .o 文件,因此需要把上面的步骤进行拆分
1 | gcc -c sub.cpp -o sub.o |
这样如何只修改了 sub.cpp ,就只需要重新生成 sub.o 文件,然后重新生成最终的可执行文件
2.2 如何编写Makefile文件
执行 Makefile 文件,只需要在Makefile 的目录下 执行make
指令就行
2.2.1. 一个规则(观看makefile、cmake、shell目录下的m1)
1 | 目标:依赖条件 |
默认情况下只会执行 MakeFile 中的第一个命令。
但若想生成目标文件,则会检查命令中的依赖是否存在,如果不存在就会往下查找是否有生成该依赖条件的命令,如有就会执行生成依赖再生成目标文件。
会检测规则中的目标是否需要更新,必须先检测它的依赖性(通过更新时间判断),只需要重新生成依赖中被修改的依赖,然后再更新目标文件
2.2.2. 两个函数(观看makefile、cmake、shell目录下的m2)
src = $(wildcard *.cpp)
// 找到当前目录下所有后缀为.cpp的文件,然后赋值给src$(src) 取变量src的值
obj = $(patsubst %cpp,%o,$(src))
//把src变量中所有后缀为.cpp的文件替换成.o文件$(obj) 取变量obj的值
make clean -n 注意加上 -n 预执行
make clean 执行 clean 命令
如果目录下有 clean 文件夹,则会有冲突,这时只需要生成伪目标就行
1 | src = $(wildcard *.cpp) |
2.2.3. 三个自动变量(观看makefile、cmake、shell目录下的m3)
多行注释 :'
- $@:表示规则中的目标
- $^:表示规则中所有的依赖条件,组成一个列表,以空格隔开,如果这个列表有重复项则消除重复项
- $<:表示规则中的第一个依赖条件,如果运行在模式套用中,相当于取出依赖条件套用在该模式中
1 | src = $(wildcard *.cpp) |
3.cmake简介和安装
写 CMakeLists.txt 里面用 CMake 语法写,会帮我们生成 Makefile 用于编译管理项目
- 去官网 下载cmake的最新linux版本,这里下载的是
cmake-3.18.3.tar.gz
拷贝
到linux系统的/lib
目录下新建的cmake目录
并解压
,需要root权限- cd到解压后的cmake目录中运行
sudo ./bootstrap
命令进行安装 - 安装完成执行
sudo make
- 最后执行
sudo make install
- 可以在任一位置 使用
cmake --version
查看安装的版本
1 | 如果不能在任一位置 使用`cmake --version` 查看安装的版本,则配置环境变量 |
安装问题:
1 | 有的会出现没安装 make的情况,使用以下命令 |
1 | sudo add-apt-repository ppa:ubuntu-toolchain-r/test |
1 | 你在安装完之后可以采用下面的指令来查看当前系统中安装的所有的gcc和g++的版本: |