Makefile的使用
一、makefile的使用规则
MakeFile可以简单的理解为是一个项目管理的工具。make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
Makefile的规则很简单:
target......:preprequisites.....
command
..........
其中,
target也就是一个目标文件,可以是Object File,也可以是执行文件。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)。
这是一个文件的依赖关系。依赖关系的实质上就是说明了目标文件是由哪些文件生成的。也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。换句话说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个tab键开头。
注:
clean不是一个文件,只是一个动作,冒号后面什么也没有,那么make就不会自动去找其依赖。要执行其后的命令,就要在make命令后明显的指出这个lable的名字。
变量的使用。如:objects=main.o aaa.o bbb.o edit:$(objects) gcc -o edit $(objects)
二、实例
1、基本.c编译
OBJS = calculate.o CC = gcc CFLAGS = -Wall -O -g main:$(OBJS) // 第一个target作为最终目标 $(CC) $(OBJS) -o calculate calc.o:calculate.c //内建规则,从.c到.o, $<依赖列表的第一个发文件名 $(CC) $(CFLAGS) -c $< -o calculate.o .PHONY: clean //.PHONY表示clean是一个“伪目标” clean: rm *.o calculate
2、含include,lib
TBIN = get_self_slot CC = mips64-octeon-linux-gnu-gcc-4.3.3 .c.o: //首先写的.c实际上是依赖关系,.o才是目标文件。也即 —— %.o: %.c $(CC) -c -g -W -I ./include/ $< //编译、汇编指定的源文件,但是不进行链接 all: $(TBIN) $(TBIN):$(TBIN).o $(CC) $(TBIN).o -ldl -o $(TBIN) //-l指定链接环节中程序可以调用的库文件 clean: rm -rf *.o *.d $(TBIN)
3、隐式规则
CC = gcc object = lexer.o count_words.o count_words: $(object) -lfl $(CC) $(object) -lfl -o count_words count_words.o: //make可以根据.o文件的文件名自动推导出同名的.c文件并加入依赖关系 lexer.o: lexer.c: lexer.l flex -t lexer.l > lexer.c clean: rm lexer.c $(object) count_words
三、注意
1、make会一层一层的去找文件的依赖关系,最终编译出第一个目标文件
2、只要任何prerequisite 比 target新,那么这个目标文件就会被下面的命令重新生成。每一个命令都会被传递到shell中,并在自己的子shell里面执行。
3、GNU make可以根据.o文件的文件名自动推导出同名的.c文件并加入依赖关系,不需要我们手动注明。并且gcc -c也会被自动推导出来。—— 隐式规则
4、自动变量:
$@ 目标文件的文件名; $% 仅当目标文件为归档成员文件(.lib 或者 .a)时,显示文件名,否则为空; $< 依赖(prerequisite)列表里面的第一个文件名; $? 所有在prerequisite列表里面比当前目标新的文件名,用空格隔开; $^ 所有在prerequisite列表中的文件,用空格隔开; 如果有重复的文件名(包含扩展名),会自动去除重复; $+ 与$^相似,也是prerequisite列表中的文件名用空格隔开,不同的是这里包含了所有重复的文件名; $* 显示目标文件的主干文件名,不包含后缀部分。
来源:Makefile基本语法_zhj失落之地的博客-CSDN博客_makefile
Makefile (3) 基本语法和使用 - kmist - 博客园 (cnblogs.com)
浙公网安备 33010602011771号