文章目录
工程管理器make
如何编写Makefile文件
缺点:makefile编译速度很慢,只能实现自动编译,makefile适用于小型项目
1.1 什么是工程
多个源文件 + 其他文件(图片+头文件+脚本文件)
1.2 工程管理器的作用
编译多个文件 (可以实现自动编译)
------gcc + 所有源文件 -o 可执行文件
1.3 makefile文件
- make的依赖makefile文件
- makefile文件是一种脚本文件(批处理),存在相关语法
- makefile语法:
三要素:目标、依赖、命令
格式:
目标:依赖
tab 命令
- 目标:最终生成的文件
- 依赖:生成目标时所需要的文件
- 命令:生成目标时,需要执行的命令
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello
真目标和伪目标
真目标:如hello和hello.o
伪目标:如clean
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello
.PHONY:clean
clean:
rm -f hello hello.o
对于
.PHONY
可以查看网站:
Makefile中.PHONY的作用
1.4 执行顺序:
make:默认从第一个目标体执行
make + 目标体:从对应的目标体执行
如果目标体后面依赖的文件是一个目标的话,先执行依赖对应的目标,再执行目标体的命令
再来体会一下
hello:hello.o
gcc hello.o -o hello
hello.o:hello.c
gcc -c hello
.PHONY:clean install
clean:install
rm -f hello hello.o
install:
cp hello bin
1.5 多级目录的Makefile编写
如果有其他Makefile文件,可以格式:make -f 目标文件(如:Makefile1、Makefile2)
#Makefile1
main:main.c add.c sub.c
gcc $^ -o $@
#Makefile2
main:main.o add.o sub.o
gcc $^ -o $@
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
.PHONY:clean
clean:
rm -f main.o add.o sub.o main
Makefile2更优(非常有必要!!!)
优势:如果单个.c文件被修改了,Makefile2只会重新编译那个修改过后的文件
如果是Makefile1,则都会重新编译,很耗时
隔断
- 对源码文件进行分类(学会划分目录)
- make menuconfig(动态选择,不用命令)
多级目录下的makefile
顶层Makefile:总控Makefile
子目录Makefile:功能Makefile
script目录Makefile:头文件Makefile
查看顺序:script目录 --> 顶层 -->子目录
- 总控Makefile:进入各个功能子目录下执行make命令,将各个子目录下的.o文件链接生成可执行文件
- 功能Makefile:将当前目录下的.c文件编译生成.o文件
- 头文件Makefile:定义一些变量
附
- make不会去编译已经是最新的文件
- makefile命令尽量成首字母大写,即Makefile
- makefile中用
#
注释 - 在命令前加
@
,在运行时,可以隐藏所执行命令
hello:hello.o
@gcc hello.o -o hello
hello.o:hello.c
@gcc -c hello
- echo 命令相当于printf(打印)
hello:hello.o
@gcc hello.o -o hello
@echo make done!
hello.o:hello.c
@gcc -c hello
@echo make done!
- 默认变量
Makefile中默认变量 | 默认变量的作用 |
---|---|
$@ | 表示目标文件名称,包含扩展名 |
$^ | 表示所有的依赖文件,以空格隔开,不重复 |
$< | 表示第一个依赖文件的名称 |
$+ | 表示所有的依赖文件,空格隔开,可以重复 |
$* | 表示目标文件的名称,不包含扩展名 |
$? | 依赖项中,所有比目标文件新的依赖文件 |
多用前三个
hello:hello.o
@gcc $^ -o $@