Linux开发工具之Makefile(上),开发工具makefile


二、makefile(上)01.make工具  利用make工具可以自动完成编译工作。这些工作包括:如果修改了某几个源文件,则只重装新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这个自动编译可大大简化开发工作,避免不必要的重新编译。  make工具通过一个称为Makefile的文件来完成并自动维护编译工作。Makefile文件描述了整个工程的编译、链接等规则。02.Makefile的基本规则:  TARGET...:DEPENDENCIES... COMMAND ...  目标(TARGET)程序产生的文件,如何执行文件和目标文件;目标也可以是要执行的动作,如clean,也成为伪目标。  依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依赖于多个文件。  命令(command)是make执行的动作(命令是shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!  如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容#touch main.c add.c sub.c add.h sub.h#lsmain.c add.c sub.c add.h sub.h#vi main.cint main(){ return 0;}#vi Makefilemain:main.o add.o sub.o gcc -Wall -g main.o add.o sub.o -o mainmain.o:main.c gcc -Wall -g -c main.c -o main.oadd.o:add.c add.h gcc -Wall -g -c add.c -o add.osub.o:sub.c sub.h gcc -Wall -g -c sub.c -o sub.o#make(默认生成第一个目标)#lsmain#make(文件没有变化)make:'main' id up to date#touch sub.h(重新生成sub.h)#makegcc -Wall -g -c sub.c -o sub.ogcc -Wall -g main.o add.o sub.o -o mainclean:(伪目标,并不是要生成的文件,用来删除这些文件) rm -f main main.o add.o sub.o#make clean将链接文件全部删除#make main.o只生成main.o这个文件.PHONY:clean(Makefile文件的最开头.表示clean是一个伪目标)如果Makefile所在的文件夹下,存在clean文件,则执行make clean时会提示:make:'clean'is up to date.03.Makefile自动化变量$@:规则的目标文件名$<:规则的第一个依赖文件名$^:规则的所有依赖文件列表#vi Makefile.1.PHONY:cleanOBJECTS=main.o add.o sub.omain:$(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..."(命令还是要执行) rm -f main $(OBJECTS)#make(正常工作)#make clean(正常工作)#make clean -f Makefile.1(以Makefile.1的规则来执行clean这个命令)begin delete...rm -f main main.o add.o sub.o04.Makefile编译多个可执行文件  模式规则:%.o:%.c  后缀规则:.c.o#mkdir 01#mv *.c 01#ls#mv *.* 01#ls01 Makefile#mv Makefile 01#ls#mkdir 02#cd 02#touch 01test.c 02test.c(01test.c,02test.c都要生成可执行文件)#vi 01test.c int main(void){ return 0;}#vi02test.cint main(void){ return 0;}#vi Makefile.PHONY:cleanBIN=01test 02testall:$(bin)01test:01test.o gcc -Wall -g  $^ -o $@02test:02test.o gcc -Wall -g  $^ -o $@clean: rm -f *.o $(BIN)#make01test 02test#vi MakefileBIN依赖两个文件all这个目标依赖BIN两个文件编译器自动将同名的"*.c"文件生成同名可执行文件#makecc 01test.c -o 01testcc 02test.c -o 02test#make clean#ls01test.c 02test.c Makefile#makecc -c -o 01test.o 01test.cgcc -Wall -g -c 01test.o -o 01test#make clean#ls01test.c 02test.c Makefile#vi Makefile%.o:%.c(将对应的.c文件生成.o文件) gcc -Wall -g -c $< -o $@#make clean#make#ls#vi MakefileCC=gccCFLAGS=-Wall -g#%.o:%.c# $(CC) $(CFLAGS) -c $< -o $@.c.o: $(CC) $(CFLAGS) -c $< -o $@01test:01test.o $(CC) $(CFLAGS) $^ -o $@02test:02test.o(将光标定位到这里,输入2yy,复制两行) $(CC) $(CFLAGS) $^ -o $@(点击p,复制到这里)#make clean#make#ls#vi 03test.cint mian(void){ return 0;}

相关内容