1.make与Makefile介绍
- make工具
利用make工具可以自动完成编译工作。这些工作包括:
(1)如果仅仅修改了某几个源文件,则只重新编译这几个源文件;
(2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
利用这种自动编译可大大简化开发工作,避免不必要的重新编译 - Makefile
make工具通过一个称为Makefile的文件来完成并自动维护编译工作。
Makefile文件描述了整个工程的编译,连接等规则。
2.Makefile基本规则
- 规则如下
TARGET...:DEPENDENCIES
COMMAND
...
(1)目标TARGET程序产生的文件,如可执行文件和目标文件,中间文件(.s文件);
目标也可以是要执行的动作,如:clean,也称之为伪目标
(2)依赖DEPANDENCIES是用来产生目标的输入文件列表,一个目标通常依赖于多个文件
(3)命令COMMAND是make执行的动作(命令是shell命令或者是可在shell下执行的程序)。
注意:每个命令行的起始字符必须为TAB字符
(4)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容
目标文件可以有1个或者多个
依赖文件可以有1个或者多个,也可以没有
3.简单的Makefile编写
- eg1:03make\01
文件夹包含的内容:
只有main.c有代码,代码如下:
int main(void)
{
return 0;
}
- Makefile1
.PHONY:clean ##显示指定clean为一个伪目标,怕该目录下有个clean名字的文件,不能编译
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o
clean:
rm -f main main.o add.o sub.o
- Makefile2
.PHONY:clean
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
main.o:main.c
gcc -Wall -g -c $< -o $@
add.o:add.c add.h
gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
gcc -Wall -g -c $< -o $@
clean:
@echo "begin delete ..." ##该语句(echo "begin delete ...")不想打印出来,就在最前面加一个@符号
rm -f main $(OBJECTS)
- 测试Makefile2
(1)如果不加@
(2)加@
make 直接输入make会执行第一个目标
make main.o make +目标也可以执行,但是只执行该目标的命令
make makefile Makefile文件名字也可以是makefile
make clean -f Makefile.1 表示用Makefile.1中的规则来执行,指定Makefile文件
4.Make自动化变量
$@ | 规则的目标文件名 |
$< | 规则的第一个依赖文件名 |
$^ | 规则的所有依赖文件列表 |
- eg:见上述03make\01\Makefile2
5.Makefile编译多个可执行文件
- 模式规则
%.o:%.c
- 后缀规则
.c.o:
- eg:03make\02
(1)目录如下
(2)文件的内容如下
=========03make\02\01test.c==========
int main(void)
{
return 0;
}
========================
=================03make\02\02test.c===============
int main(void)
{
return 0;
}
======================
pub.c和pub.h都为空
- Makefile1
.PHONY:clean all
BIN=01test 02test ##直接执行:make Makefile
all:$(BIN) ##all也是伪目标,这里并没有给01test,02test是如何生成的,编译器会自动推导,
clean: ##会将同名的.c文件生成同名的可执行文件,eg:01test.c生成01test
rm -f $(BIN)
- Makefile2
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01test 02test
all:$(BIN) ##all代表第一个终极目标
%.o:%.c ##将对应的.c文件生成对应的.o文件,等价于.c.o:
$(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
$(CC) $(CFLAGS) $^ -o $@ ##生成可执行文件不需要-c
02test:02test.o pub.o ##若02test还依赖pub模块(pub.c,pub.h)
$(CC) $(CFLAGS) $^ -o $@
clean:
rm -f $(BIN) *.o
- 测试: