浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS
1. include文件包含
当 make
读取到 include
关键字的时候,会暂停读取当前的 Makefile
,而是去读 include
包含的文件,读取结束后再继读取当前的 Makefile
文件。
include
使用的具体方式如下:
include <filenames>
filenames
是 shell
支持的文件名(可以使用通配符表示的文件)。
注意:
include
关键字所在的行首可以包含一个或者是多个的空格(读取的时候空格会被自动的忽略),但是不能使用Tab
开始,否则会把include
当作式命令来处理。
包含的多个文件之间要使用空格分隔开。使用include
包含进来的Makefile
文件中,如果存在函数或者是变量的引用,它们会在包含的Makefile
中展开。
include
通常使用在以下的场合:
- 在一个工程文件中,每一个模块都有一个独立的
Makefile
来描述它的重建规则。它们需要定义一组通用的变量定义或者是模式规则。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中,需要的时候用include
包含这个文件。 - 当根据源文件自动产生依赖文件时,我们可以将自动产生的依赖关系保存在另一个文件中。然后在
Makefile
中包含这个文件。
注意:如果使用
include
包含文件的时候,指定的文件不是文件的绝对路径或者是为当前文件下没有这个文件,make
会根据文件名会在以下几个路径中去找,
- 首先我们在执行
make
命令的时候可以加入选项-I
或--include-dir
后面添加上指定的路径,如果文件存在就会被使用; - 如果文件不存在将会在其他的几个路径中搜索:
usr/local/include
和usr/include
;
如果在上面的路径没有找到 include
指定的文件,make
将会提示一个文件没有找到的警示提示,但是不会退出,而是继续执行 Makefile
的后续的内容。
当完成读取整个 Makefile
后,make
将试图使用规则来创建通过 include
指定但不存在的文件。当不能创建的时候,文件将会保存退出。
使用时,通常用 -include
来代替 include
来忽略文件不存在或者是无法创建的错误提示,使用格式如下:
-include <filename>
使用方法和 include
的使用方法相同。
这两种方式之间的区别:
include <filenames>
,make
在处理程序的时候,文件列表中的任意一个文件不存在的时候或者是没有规则去创建这个文件的时候,make
程序将会提示错误并保存退出;-include <filenames>
,当包含的文件不存在或者是没有规则去创建它的时候,make
将会继续执行程序,只有真正由于不能完成终极目标重建的时候我们的程序才会提示错误保存退出;
2. 使用示例
目录结构如下:
wohu@ubuntu:~/cpp/func$ ls
common_variable demo.cpp demo.h Makefile
common_variable
内容如下:
a = 11
b = 22
c = 33
Makefile
内容如下:
include common_variable
all:echo $(a) $(b) $(c)
执行 make 之后
wohu@ubuntu:~/cpp/func$ make
echo 11 22 33
11 22 33
wohu@ubuntu:~/cpp/func$
3. MAKECMDGOALS
make
在执行时会设置一个特殊变量 – MAKECMDGOALS
,该变量记录了命令行参数指定的终极目标列表,没有通过参数指定终极目标时此变量为空。
ifeq ($(MAKECMDGOALS), aa cc)
obj = aa cc
else ifeq ($(MAKECMDGOALS), bb)
obj = bb
else
obj = other
endifaa:@echo $(obj)
bb:@echo $(obj)
cc:@echo $(obj)
other:@echo $(obj)
执行 make
结果
wohu@ubuntu:~/cpp/func$ make aa cc
aa cc
aa cc
wohu@ubuntu:~/cpp/func$ make aa
other
wohu@ubuntu:~/cpp/func$ make bb
bb
wohu@ubuntu:~/cpp/func$ make cc
other
wohu@ubuntu:~/cpp/func$
浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS相关推荐
- CTFSHOW web入门 命令执行+文件包含+PHP特性
刷题时间记录表 ID 开始时间 结束时间 刷题范围 1 2021.08.23 19:20 2021.08.23 21.30 web41-45 2 2021.08.24 22:16 2021.08.25 ...
- 文件源码读取 php伪协议,include(文件包含漏洞,php伪协议)
点击tips 查看元素,也并没有有用的信息,联想到题目,include 想起了文件包含漏洞. 构造payload ?file=/../../../../../../flag.php 没有返回东西.看完 ...
- ctfshow web入门 78-88的文件包含
1. web78 PHP伪协议读取 ?file=php://filter/convert.base64-encode/resource=flag.php 2. web79 ?file=data://t ...
- 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...
- 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
1. 什么是 Makefile Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目.一旦写编写好 Makefile 文件,只需要一个 ma ...
- 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息
1. 常见的错误信息 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -.或者 make 使用 -k 选项执行时. make 执行过程的致命错误都带有前缀字符串 ***.错误信息 ...
- 浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用
1. 嵌套执行 make 在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则,如果在一个 Makefile 文件中描述所有模块的编译规则,就会很乱,执 ...
- 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )
1. foreach 函数 foreach 函数定义如下: $(foreach <var>,<list>,<text>) 函数的功能是:把参数 <list&g ...
- 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin
1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...
最新文章
- Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
- HMM 模型输入数据处理的优雅做法 来自实际项目
- 通俗的说下浏览器的渲染过程
- JavaScript 私有成员
- oracle rda结果,Oracle诊断工具-RDA使用
- 解决git rebase操作后推送远端分支不成功的问题
- 【leetcode】332. Reconstruct Itinerary
- 本地项目上传至git码云步骤(超详细,附图文)
- BOSS直聘简历导出为PDF文档
- Vue学习之旅----vuex实现不同组件的数据共享 数据持久化
- 详解百度地图API之驾车导航
- Android中常用的一些颜色色值color整理
- 辞职信前端源码文件分享
- 【外卖点餐平台项目遇到的问题】
- Resend messages one by one
- 人工智能(AI)和机器学习——未来的发展趋势
- springBoot redis开发的Java快递代拿系统(含人脸识别,验证码登录)
- leaflet 设置地图上某个标注位于页面最上层
- 一、微信小程序-快速回顾(创建项目、项目结构分析)
- WinIo驱动级键盘模拟编程