Makefile 基础(二)—— Makefile 自动推导+ Makefile伪目标

        目录

1、Makefile 自动推导(隐含规则)

(1) 依赖项都在当前目录下

(2) 一部分依赖项不在当前目录下

2、Makefile 伪目标


1、Makefile 自动推导(隐含规则)

所谓隐含规则指的是,我们在Makefile文件中不使用 gcc/g++ 命令来生成目标文件,但是执行make命令以后,Makefile 会自动帮我们执行。这就是Makefile 的隐含规则,也可以称为自动推导的过程。

既然是自动推导,那就需要自己去寻找 .c 文件、.h 文件,下面就从两个角度来考虑

  • 第一个角度,所需依赖项都在当前目录下
  • 第二个角度,一部分依赖项不在当前目录下

(1) 依赖项都在当前目录下

如果我们只提供了 .o 文件,此时执行 make 命令的时候,Makefile 自动推导 .o 需要的依赖项为 .c 文件,此时编译器会默认在当前目录和环境变量中查找,然后自动帮我们生成 .o 文件 以及 目标文件。

OBJS=test.o main.o
TARGET=main 
    
$(TARGET): $(OBJS)    # 自动推导

这个过程中生成 .o 文件用到的生成命令: 

# CC 默认是 gcc
# CPPFLAGS 是 gcc预编译选项,无默认值
# CFLAGS 是 gcc 的编译选项,无默认值
$(CC) –c $(CPPFLAGS) $(CFLAGS)

(2) 一部分依赖项不在当前目录下

假设有个 test.h 文件的所在位置是 ./include/ ,Makefile在预处理阶段会将头文件展开,如果这个时候找不到头文件,就无法生成 .i 文件,更不用说后面的 .s、.o 文件了。

因为是让编译器自己去推导的,所以我们应该告诉编译器在哪个目录下去找头文件,此时就要手动设置预定义变量 CFLAGS了,而额外添加头文件的搜索路径用的是 -I 选项

OBJS=test.o main.o
TARGET=main 
CFLAGS=-I./include        # 添加额外的头文件搜索路径

$(TARGET): $(OBJS)        # 自动推导

2、Makefile 伪目标

伪目标和普通的目标文件不一样,只有目标,没有依赖项,也就不会生成目标文件,一般用于清理、备份工作。伪目标有点类似于C中的函数,一般包含以下两步:

  • 伪目标的声明
    • .PHONY:  伪目标1  伪目标2...
  • 伪目标的实现(定义)
    • 伪目标1:命令执行语句
    • 伪目标2:命令执行语句
OBJS=test.o main.o
TARGET=main 
CFLAGS=-I./include      
$(TARGET): $(OBJS)      

.PHONY:clean cleanAll        # 声明伪目标
clean:                       # 伪目标实现
    $(RM) $(TARGET)    
cleanAll:
    $(RM) $(OBJS) $(TARGET)    # RM 是预处理变量,$(RM)等价于 rm -f

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值