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)

 

posted @ 2022-06-07 18:03  Lin_泠沐  阅读(695)  评论(0)    收藏  举报