Makefile自动生成依赖文件及通配符使用方法

Makefile自动生成依赖文件及通配符使用方法

生成依赖文件

在 Makefile 中, 我们的依赖关系可能需要包含一系列的头文件

gcc参数介绍:

  • -M:生成依赖关系,包含标准库
    生成文件的依赖关系,同时也把一些标准库的头文件也包含了进来。本质是告诉预处理器输出一个适合 make 的规则,用于描述各目标文件的依赖关系。对于每个源文件,预处理器输出 一个 make 规则,该规则的目标项 (target) 是源文件对应的目标文件名,依赖项 (dependency) 是源文件中 ‘#include’ 引用的所有文件,生成的规则可以是单行,但如果太长,就用’\’换行符续成多行。规则 显示在标准输出,不产生预处理过的C程序。 
    注意:该选项默认打开了 -E 选项, -E 参数的用处是使得编译器在预处理结束时就停止编译
$ gcc -M main.c 
main.o: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
 /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h /usr/include/unistd.h \
 /usr/include/x86_64-linux-gnu/bits/posix_opt.h \
 /usr/include/x86_64-linux-gnu/bits/environments.h \
 /usr/include/x86_64-linux-gnu/bits/confname.h /usr/include/getopt.h
  • -MM:生成依赖关系,不包含标准库
    生成文件的依赖关系,和 -M 类似,但不包含标准库的头文件
$ gcc -MM main.c 
main.o: main.c
  • -MF File:属于依赖关系到指定文件
    当使用了 ‘-M’ 或者 ‘-MM’ 选项时,则把依赖关系写入名为 ‘File’ 的文件中。若同时也使用了 ‘-MD’ 或 ‘-MMD’,’-MF’ 将覆写输出的依赖文件的名称
$ gcc -MM -MF main.d main.c
$ cat main.d 
main.o: main.c
  • -MT Target:指定依赖关系中的目标
    在生成的依赖文件中,指定依赖规则中的目标
$ gcc -MM -MT hello.d main.c 
hello.d: main.c
  • -MD:生成依赖关系(包含标准库)并指定输出文件,不影响编译
    等同于 -M -MF File,但是默认关闭了 -E 选项。其输出的文件名是基于 -o 选项,若给定了 -o 选项,则输出的文件名是 -o 指定的文件名,并添加 .d 后缀,若没有给定,则输入的文件名作为输出的文件名,并添加 .d 后缀,同时继续指定的编译工作。
    注意:-MD 不会像 -M 那样阻止正常的编译任务,因为它默认关闭了 -E 选项,比如命令中使用了 -c 选项,其结果要生成 .o 文件,若使用了 -M 选项,则不会生成 .o 文件,若使用的是 -MD 选项,则会生成 .o 文件
$ gcc -MD main.c -o hello
$ ls hello hello.d -al
-rwxrwxr-x 1 pateo pateo 8600 8月  29 14:55 hello
-rw-rw-r-- 1 pateo pateo  841 8月  29 14:55 hello.d
$ cat hello.d 
hello: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
 /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h /usr/include/unistd.h \
 /usr/include/x86_64-linux-gnu/bits/posix_opt.h \
 /usr/include/x86_64-linux-gnu/bits/environments.h \
 /usr/include/x86_64-linux-gnu/bits/confname.h /usr/include/getopt.h
  • -MMD:生成依赖关系(不包含标准库)并指定输出文件,不影响编译
    类似于 “-MD”,但是输出的依赖文件中,不包含标准头文件

参考https://blog.csdn.net/BobYuan888/article/details/88709449

通配符

  • wildcard : 扩展通配符
  • notdir : 去除路径
  • patsubst :替换通配符
  • $(VAR:A=B):对于一个已经定义的变量VAR,可以使用“替换引用”将其值中的后缀字符(串)替换为指定的字符(串)
SRC=$(wildcard ./helloworld/*.c ./helloworld/*.cpp)
DIR=$(notdir $(SRC))
OBJC=$(patsubst %.c, %.o, $(wildcard ./helloworld/*.c))
OBJCPP=$(SRC:.cpp=.o)

all:
	@ echo $(SRC)
	@ echo $(DIR)
	@ echo $(OBJC)
	@ echo $(OBJCPP)
$ make -f abc 
./helloworld/main.c ./helloworld/mile.cpp ./helloworld/helloworld.cpp
main.c mile.cpp helloworld.cpp
./helloworld/main.o
./helloworld/main.c ./helloworld/mile.o ./helloworld/helloworld.o
  • $@  表示目标文件
  • $^  表示所有的依赖文件
  • $<  表示第一个依赖文件
  • $?  表示比目标还要新的依赖文件列表

参考https://blog.csdn.net/srw11/article/details/7516712

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值