makefile文件编写
- 格式:doc
- 大小:50.00 KB
- 文档页数:6
Makefile文件编写详解
——WangYiwei 利用makefile工具可以自动完成编译工作。如果仅修改了几个源文件,
则只重新编译这几个源文件,其他没有修改的不再去编译。如果某个头文件被修改,则只重新编译包含这几个头文件的源文件。因此可以简化开发工作。
格式:
TARGET(目标) :DEPENDENCIES(依赖)
COMMOND(命令)
目标:程序要产生的文件,如可执行文件和目标文件。目标也可以是要执行的动作,如clean也成为伪目标。
依赖:是用来产生目标输入文件列表,一个目标通常依赖于多个文件。
命令:是make执行的动作(命令是shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符都是table字符
$@ 规则目标文件名
$< 规则第一个依赖文件名
$^ 规则的所有文件列表
例子:
(1)生成一个可执行文件:
说明:在01目录下有main.c sub.c sub.h add.c add.h Makefile,以下部分是Makefile的内容
①简单的例子
.PHONY: clean
#显示地指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作main: main.o add.o sub.o
gcc main.o add.o sub.o -o main
main.o: main.c add.h sub.h
gcc -c main.c -o main.o
add.o: add.c add.h
gcc -c add.c -o add.o
sub.o: sub.c sub.h
gcc -c sub.c -o sub.o
clean:
@echo "remove file ..."
rm main main.o add.o sub.o
②利用自定义变量和自动化变量
.PHONY: clean
#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作OBJECTS = main.o add.o sub.o
#自定义变量
main: $(OBJECTS)
gcc -Wall -g $^ -o $@
main.o: main.c add.h sub.h
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 "remove file ..."
#在命令前加@表示不显示命令
rm -f main $(OBJECTS)
(2)生成多个可执行文件
说明:在02目录下有01test.c 02test.c 03test.c Makefile,以下部分是Makefile 的内容
①默认规则
.PHONY: all clean
#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作CC = gcc
CFLAGS = -Wall -g
BIN = 01test 02test 03test
all: $(BIN)
clean:
@echo "Begin remove ..."
rm -f $(BIN)
执行之后生成01test 02test 03test可执行文件,系统执行的是隐含推导规则,也可以自己编写推导规则。
②编写模式规则,%o:%c
说明:%o(目标):%c(依赖),系统将先将.c源文件生成.o的目标文件,再将.o 源文件生成可执行文件
.PHONY: all clean
BIN = 01test 02test 03test #自定义变量
all: $(BIN)
%.o:%.c
gcc -Wall -g -c $< -o $@
01test: 01test.o
gcc -Wall -g $^ -o $@
02test: 02test.o
gcc -Wall -g $^ -o $@
03test: 03test.o
gcc -Wall -g $^ -o $@
clean:
@echo "Begin remove ..."
rm -f *.o $(BIN)
③编写后缀规则.c.o:
说明:系统每次要执行.o目标文件生成可执行文件的过程前,通知后缀规则生成.o可执行文件。
.PHONY: all clean
CC = gcc
CFLAGS = -Wall -g
BIN = 01test 02test 03test
all: $(BIN)
.o.c:
$(CC) $(CFLAGS) -c $< -o $@
01test: 01test.o
$(CC) $(CFLAGS) $< -o $@
02test: 02test.o
$(CC) $(CFLAGS) $< -o $@
03test: 03test.o
$(CC) $(CFLAGS) $< -o $@
clean:
@echo "Begin remove ..."
rm *.o $(BIN)
(3)多级目录一个makefile的实现
说明:在03目录下有test/目录main.c Makefile,在test/目录下有aa/目录test.c test.h,在aa/目录下有bb/目录aal.c aal.h,在bb/目录下有cc/目录dd/