--Makefile入门(上)
一、简介
1)make工具:利用make工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。
2)makefile:make工具通过一个称为Makefile的文件来完成并自动维护编译工作。Makefile文件描述了整个工程的编译、连接等规则。
二、Makefile基本规则
TARGET(target:目标)… :DEPENDENCIES(dependencies:依赖性,相关性)…
COMMAND(command:命令,指挥) …
说明:
1)目标(TARGET):即最终想要产生的文件,如:可执行文件和目标文件等;目标也可以是要执行的动作,如clean,也称为伪目标。
2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。
3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!(但是在CSDN上因为排版的问题,无法正常显示出来。。。)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容
三、一个简单的Makefile示例
.PHONY:clean #声明伪目标 phony:假的,欺骗的;假冒者
main:main.oadd.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.cadd.h
gcc-Wall -g -c add.c -o add.o
sub.o:sub.cadd.h
gcc-Wall -g -c sub.c -o sub.o
clean:
rm-f main.o add.o sub.o
执行:
1)make #生成第一个目标
2)makeclean #“生成”clean伪目标
3)makemain.o #仅生成main.o目标
4)make-f Makefile #指定执行的文件名
四、Makefile自动化变量
选项名 | 作用 |
---|---|
$@ | 规则的目标文件名 |
$< | 规则的第一个依赖文件名 |
$^ | 规则的所有依赖文列表 |
示例:【文件名Makefile.01】
.PHONY:clean
OBJECTS=main.oadd.o sub.o#定义变量
main:$(OBJECTS)
gcc-Wall -g $^ -o main
main.o:main.c
gcc-Wall -g -c $< -o main.o
add.o:add.cadd.h
gcc-Wall -g -c $< -o add.o
sub.o:sub.cadd.h
gcc-Wall -g -c $< -o sub.o
clean:
rm-f main $(OBJECTS)
执行:make-f Makefile.01
附:如果一条语句在执行Makefile文件时,不想打印出来,则在其前面加上@符号
五、Make编译多个可执行文件
1、Make使用隐含推导
示例1:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
clean:
rm-f $(BIN)
示例2:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
01test:01test.o
gcc-Wall -g $< -o $@
02test:02test.o
gcc-Wall -g $< -o $@
clean:
rm-f $(BIN) *.o
2、模式规则
%.o:%.c
3、后缀规则
.c.o:
示例3:
.PHONY:cleanall
BIN=01test02test
all:$(BIN)
#%.o:%.c
%.c.o: #与前一条命令作用相同
gcc-Wall -g -c $< -o $@
01test:01test.o
gcc-Wall -g $< -o $@
02test:02test.o
gcc-Wall -g $< -o $@
clean:
rm-f $(BIN) *.o
六、综合运用实例
(1)
.PHONY:cleanall
CC=gcc
CFLAGS=-Wall-g
BIN=01test02test
all:$(BIN)
#%.o:%.c
.c.o:
$(CC)$(CFLAGS) -c $< -o $@
01test:01test.o
$(CC)$(CFLAGS) $< -o $@
02test:02test.opub.o
$(CC)$(CFLAGS) $< -o $@
clean:
rm-f $(BIN) *.o
(2)
.PHONY:cleanall
CC=gcc
CFLAGS=-Wall-g
BIN=01test02test 03test
STR=$(CC)$(CFLAGS) -c $< -o $@
STR2=$(CC)$(CFLAGS) $< -o $@
all:$(BIN)
clean:
rm-f $(BIN) *.o