makefile的原理及其实现和详细解释

本文详细介绍了makefile的工作原理,包括目标与依赖的规则、变量的使用、重要变量如CPPFLAGS、CFLAGS和LDFLAGS的含义。此外,还讲解了自动变量、文件函数和替换函数的运用,以及伪目标的概念。通过示例,展示了如何编写和编译.cpp文件,以及实现清理功能的makefile规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、makefile的工作原理(规则):

      目标 : 依赖

               命令

(1)写在第一个的目标是终极目标,如果单纯的执行make指令,就会直接生成最终目标。如果目标命令无法生成目标,则会根据后面的依赖往后查找目标,直到完成所有的依赖,才执行终极目标的命令。

(2)如果想单独执行taget_x,可以使用指令make taget_x。

(3)如果makefile中的依赖时间比目标晚,命令才会重新执行,否则则不执行。

(4)大写变量一般是makefile自己维护的变量,例如其中的CC默认是CC=cc,其实也就是CC=gcc,如果我们使用g++编译cpp文件,我们就可以将其改为CC=g++。

 

2、变量的使用

可以直接在makefile中定义变量,如:

src=xx.cpp xxx.cpp xxxx.cpp

等,中间用空格隔开,如果要取回变量的值,就可以用

$src 或 $(src) 

这样会读出src中的所有变量,也就是这三个.cpp文件。

 

3、几个重要的变量

CPPFLAGS:需处理需要的选项,如 -I  (头文件路径)

CFLAGS:编译时使用的参数,如 -Wall  -g  -c

LDFLAGS:链接库使用的选项,如 -L

 

4、自动变量

%.o:%.cpp

       $(CC) -c $< -o $@    ($< 是规则中的第一个依赖,$@是规则中的目标)

 

5、获取文件函数函数(wildcard)和替换函数(patsubst)的使用

(1)获取当前文件夹下的所有.cpp文件(只是做一个.cpp文件的变量记录而已) wildcard是个函数,后面空格,再接参数

src=$(wildcard ./*.cpp)

(2)将上述文件变量替换为中间文件.o(我们在生成可执行文件时要先生成.o文件)%是个格式匹配符

obj=$(patsubst ./%.c, ./%.o, $(src))

 

6、伪目标

.PHONY:clean

clean:

         -mkdir /aa        (这里加 - 是为了如果这条指令出错,忽略继续执行下一条)

         rm $(obj) &(target) -f    ( -f 强制执行)

 

7、makefile的文件内容示例

target = test.out

#查找当前文件夹下的所有.cpp文件

src = $(wildcard ./*.cpp)

#替换.cpp文件为.o文件,保存在obj变量中

obj = $(patsubst ./%.cpp, ./%.o, $(src))

#指定为g++编译器

CC = g++

#指定头文件目录

CPPFLAGS = -I

#终极目标,依赖所有的obj文件,执行g++ xx.o xxx.o ... -o test.out

$(target):$(obj)

              $(CC) $(obj) -o $(target)

#利用.cpp文件生成中间的.o文件,target中的每一个obj依赖会往这里找,然后每一个匹配成xx.o和xx.cpp,然后再执行相应指令

%.o:%.cpp

       $(CC) -c $< -o $@    ($< 是规则中的第一个依赖,$@是规则中的目标)

#伪目标clean

.PHONY:clean

clean:

         -mkdir /aa        (这里加 - 是为了如果这条指令出错,忽略继续执行下一条)

         rm $(obj) &(target) -f    ( -f 强制执行)

#一种用法,输出一串字符

hello:

          echo "hello, makefile"

 

8、去掉注释的内容

target = test.out

src = $(wildcard ./*.cpp)

obj = $(patsubst ./%.cpp, ./%.o, $(src))

CC = g++

CPPFLAGS = -I

$(target):$(obj)

              $(CC) $(obj) -o $(target)

%.o:%.cpp

       $(CC) -c $< -o $@ 

.PHONY:clean

clean:

         -mkdir /aa

         rm $(obj) &(target) -f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值