make与Makefile
多个文件编译,须要提供一个makefile文件用它来一层层的自动化编译目标文件html
makefile
- 整个的编写流程应该以下:
all:main
main(目标文件): x.o b.o(依赖文件)
(TAB)gcc -o main x.o b.o(命令)
x.o: x.c
(TAB)gcc -c x.c
b.o: b.c
(TAB)gcc -c b.c
...
...
- 另外若是存在一行写不完须要中途换行的状况下,那就须要使用 / 进行换行
例如说:
main: a.o b.o c.o d.o e.o /
f.o h.o i.o
- 除了all以外,makefile一样能够指定目标,即以下:
clean:
rm -f *.o
这是咱们经常使用的一种目标方式,当工做目录没有clean这个文件时候,make clean就会执行删除命令
- 那么若是咱们须要在即便是有clean文件的状况下依然执行make clean,则咱们须要加入伪目标,将clean声明为伪目标以后,不论存不存在clean文件,都能正常的是执行删除,语法以下:
.PHONY:clean
clean:
rm -f *.o
- 若是想为Makefile提供输出提示,那么能够:
@echo 正在编译xxxx模块
若是不加@那么echo会被显示,就相似于Windows批处理的输出,@意思是隐藏回显
- 若是想要Make去执行多个脚本命令,那么须要在命令之间以分号隔开:
test:
cd ./test/; pwd
- 若是须要忽略makefile中的错误命令信息,那么能够在相关命令上加入‘-’或者指定make的-i参数
make -i
或者
test:
-cd ./test/
- makefile一样能够加入条件语句
ifeq($1, $2)
else
endif
或者
(if <condition>,<then-part>)
(if <condition>,<then-part>,<else-part>)
- makefile能够加入路径的设置 VPATH
VPATH <directories> :: 当前目录中找不到文件时, 就从<directories>中搜索
VPATH <pattern> <directories> :: 符合<pattern>格式的文件, 就从<directories>中搜索
VPATH <pattern> :: 清除符合<pattern>格式的文件搜索路径
VPATH :: 清除全部已经设置好的文件路径
- makefile中的定义变量和使用
variable = %.h
all: $(variable)
Make的运行
-
那么当咱们执行make时候,make的运行过程是怎么样的呢?
- make在当前目录下依次搜索下面3个文件 "GNUmakefile", "makefile", "Makefile"(推荐使用Makefile)
- 以第一个目标文件为终极目标,开始进行推导,若是说没有这个文件,或者目标依赖文件改动时间比目标文件生成时间新,那么就会对相关项进行新的生成;
- 若是依赖文件也不存在,那么make会查找makefile文件中以缺失的依赖文件为目标的相关项进行生成
-
查看文件的依赖关系,gcc 所使用的命令,能够查看后直接放入makefile做为目标用
gcc -MM kvm_main.c多线程
-
make能够增长的参数
--debug[=<options>] 输出make的调试信息, options 能够是 a, b, v
-j --jos 同时运行的命令的个数, 也就是多线程执行 Makefile
-r --no-builtin-rules 禁止使用任何隐含规则
-R --no-builtin-variabes 禁止使用任何做用于变量上的隐含规则
-B --always-make 假设全部目标都有更新, 即强制重编译
-i --ignore-error 忽略命令的错误返回
-
命令变量
RM rm -f
AR ar
CC cc
CXX g++
-
约定俗称的伪目标
all 全部目标的目标,其功能通常是编译全部的目标
clean 删除全部被make建立的文件
install 安装已编译好的程序,其实就是把目标可执行文件拷贝到指定的目录中去
print 列出改变过的源文件
tar 把源程序打包备份. 也就是一个tar文件
dist 建立一个压缩文件, 通常是把tar文件压成Z文件. 或是gz文件
TAGS 更新全部的目标, 以备完整地重编译使用
check 或 test 通常用来测试makefile的流程
资料参考:
https://www.cnblogs.com/mfryf...
https://www.cnblogs.com/wang_...测试