一 make工具:
利用make工具可以自动完成编译工作。这些工作包括:
如果仅修改了某几个源文件,则指重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译
二 make工具是通过一个称为Makefile的文件来完成并维护编译工作的。Makefile文件描述了整个工程的编译、连接等规则。
三 Makefile基本规则
TARGET...(目标):DEPENDENCES...(依赖文件)
COMMAND
...
目标(target)程序产生的文件:如可执行文件和目标文件;目标文件也可以是要执行的动作,如clean,也称为伪目标
依赖(DEPENDENCEs)是用来产生目标的输入文件列表。一个目标通常依赖于多个文件。
命令(COMMAND)是make执行的动作(命令是shell命令或者可在shell下执行的程序)注意:每个命令行的起始字符必须是TAB
如果DEPENDENCES中有一个或多个文件更新,就执行COMMAND命令来更新。
一个简单的Makefile
.PHONY:clean main:main.o add.o sub.o gcc -Wall -g main.o add.o sub.o -o main mian.o:mian.c gcc -Wall -g -c main.c -o main.o add.o:... ... sub.o:... ... clean: rm -f main main.o add.o sub.o
clean 伪目标不是真正要生成的目标,没有依赖列表。加上一个.PHONY:clean显示指定clean为伪目标
四:Makefile自动化变量。去除一些重复内容
$@: 规则的目标文件名
$<: 规则的第一个依赖文件名
$^: 规则的所有依赖文件列表
.PHONY:clean OBJECTS=main.o add.o sub.o main: $(OBJECTS) gcc -Wall -g $^ -o $@ mian.o: mian.c gcc -Wall -g -c $< -o $@ add.o: ... ... sub.o: ... ... clean: rm -f main $(OBJECTS)
再进一步改进
.PHONY:clean CC=gcc CFLAGS=-Wall -g OBJECTS=main.o add.o sub.o main:$(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ mian.o:mian.c $(CC) $(CFLAGS) -c $< -o $@ add.o:... ... sub.o:... ... clean: rm -f main $(OBJECTS)
五、Makefile编译多个可执行文件
目录下有01test.c 02test.c
01test.c要生成01test ......
%.o:%.c 等价于 .c.o:
.PHONY:clean all #all也是伪目标,要生成all就要生成BIN CC=gcc CFLAGS=-Wall -g BIN:01test 02test all:$(BIN) %.o:%.c #若不写规则,编译器会自动推导,将同名.c文件生成.o文件。再将.o文件自动推导生成目标文件(也可以自己生动添加规则) 01test: 01test.o gcc -Wall -g $^ -o $@ $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(BIN)