一、
make
与
Makefile
介绍
1、make工具
利用
make
工具可以
自动完成编译工作
。这些工作
包括
:
如果仅修改了某几个源文件
,则只重新编译这几个源文件;
如果某个头文件被修改了
,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,
避免不必要的重新编译
。
2、Makefile
make
工具通过一个称为
Makefile
的文件来完成并自动维护编译工作。
Makefile
文件描述了整个工程的编译、连接等规则。
二、Makefile基本规则
1、
TARGET … : DEPENDENCIES …
COMMAND
…
2、
目标(
TARGET
)程序产生的文件,如
可执行文件和目标文件
;目标也可以是要执行的动作,如
clean,也称为伪目标
。可以有多个,
一般只有一个
。
3、
依赖(
DEPENDENCIES
)是用来产生目标的
输入文件列表
,
一个目标通常依赖于多个文件
。
4、
命令(
COMMAND
)是
make
执行的动作(命令是
shell
命令或是可在
shell
下执行的程序)。
注意:每个命令行的起始字符必须为TAB字符
!
5、
如果
DEPENDENCIES
中有
一个或多个文件更新
的话,
COMMAND就要执行
,这就是
Makefile
最核心的内容
三、简单的Makefile编写
.PHONY:clean #防止刚好有clean文件,以致于无法执行clean动作,因此用.PHONY说明是伪目标
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:
@echo "begin delete ..."
rm -f main main.o add.o sub.o
注意:.PHONY:clean #防止刚好有clean文件,以致于无法执行clean动作,因此用.PHONY说明是伪目标
四、Make自动化变量
选项名 | 作用 |
$@ | 规则的目标文件名 |
$< | 规则的第一个依赖文件名 |
$^ | 规则的所有依赖文件列表 |
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
(1)首先:OBJECTS=main.o add.o sub.o,定义一个变量
(2)使用变量,$(OBJECTS);main:$(OBJECTS)
(3)$^所有依赖文件列表:$^=main.o add.o sub.o
(4)$@目标文件名:$@=main
(5)$<第一个依赖文件名:$<=add.c
(6)则改为了:
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
add.o:add.c add.h
gcc -Wall -g -c $< -o $@
2、举例:
.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:
rm -f main $(OBJECTS)
3、运行命令
# make
# make clean
或者: # make clean -f Makefile.1,执行其他的Makefile文件
五、Makefile编译多个可执行文件
1、假设一个Makefile的例子:
.PHONY:clean
BIN=01test 02test
01test:01test.o
gcc -Wall -g $^ -o $@
02test:02test.o
gcc -Wall -g $^ -o $@
clean:
rm -f *.o $(BIN)
(1)执行Makefile文件会自动执行
cc -c -o 01test.o 01test.c
cc -c -o 02test.o 02test.c
2、如果现在我们不想自动执行上述的语句,可以有一下两种方式
(1)、模式规则
%.o:%.c
gcc -Wall -g -c $< -o $@
表示将当前文件下对应的.c文件生成.o文件(必须要加入-c选项)
(2)、后缀规则
.c.o:
gcc -Wall -g -c $< -o $@
假设test03需要调用pub.c的文件
解释:all也是伪目标,表示要生成all的文件,应该生成依赖的BIN文件
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01test 02test 03test
all:$(BIN)
#%.o:%.c
# $(CC) $(CFLAGS) -c $< -o $@
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
$(CC) $(CFLAGS) $^ -o $@
02test:02test.o
$(CC) $(CFLAGS) $^ -o $@
03test:03test.o pub.o
$(CC) $(CFLAGS) $^ -o $@
clean:
rm -f *.o $(BIN)