make与Makefile
多个文件编译,需要提供一个makefile文件用它来一层层的自动化编译目标文件
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_...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。