当前位置: 首页 > news >正文

Makefiles学习1

初识"Makefiles"

创建一个 “Makefile” 文件
touch	Makefile

“touch” 用于修改文件或者目录的时间属性,包括访问时间和修改时间,若文件不存在,则重新建立一个新的文件。这里有两个需要我们注意的:

进入并编辑"Makefile" 文件
vim Makefile
Hello:echo "hello, word"
编译 “Makefile” 文件
make Makefile

Makefile语法

Makefile由一组rules组成。rule通常如下所示:

targets : prerequisitsecommandcommandcommand
  • tatgets (目标)是文件名,用空格分割。通常每个 rule 只有一个
  • commands (命令) 是通常用于创建目标的一系列步骤,这些需要以制表符(tab)开头,不可以是空格
  • prerequisites(先决条件)也是文件名,用空格分割。在运行目标命令之前,这些文件需要存在。这些也称为 dependencies(依赖项)
创建一个更典型的 Makefile-一个编译单个C文件的Makefile.
  • 创建一个名为"blah.c"文件
int main()
{return 0;
}
  • 然后创建 Makefile
blah:cc blah.c -o blah

因为没有先决条件,所以第一次运行将会编译获取blah文件(编译失败可能是没有安装gcc),以后无论如何更改 blash.c 并再编译的时候则会显示"blah 已是最新"

我们通过添加一个先决条件来解决这个问题:
blah:blah.ccc blah.c -o blah

这样在 blah.c 发生改变的时候,再使用 make 编译,blah将会被编译

另一个列子
blah:blah.occ blah.o -o blah
blah.o :blah.ccc -c blah.c -o blah.o
blah.c:echo "int main(){return 0;}">blah.c
下一个示例
some_file:other_fileecho "This  will always run, and这里有两个需要我们注意的:
- runs second"touch some_file
other_file:echo "This will always run, and runs first"

这个示例刚开始我有点迷,为什么touch some_file会让 Makefile 可以多次编译呢,some-file 的时间戳是比other-file新的,其实这个不管 touch some-file 的事情,是因为 other-file 始终不是一个文件。

Make clean
some_file:touch some_file
clean:rm -f some_file

这里有两个需要我们注意的

  • 它不是第一个目标(默认目标)也不是先决条件。这意味着除非显示调用 make clean,否则它永远不会被调用
  • 它不是一个文件名。如果碰巧有一个名为“clean”的文件,则此目标将无法运行,这不是我们想要的结果 ,以后会使用 .PHONY 用来解决此问题

变量

变量只能是字符串。

示例
files:file1 file2
some_file:$(files)echo "Look at this variable:"$(this)touch some_file
file1:touch file1
file2:touch file2clean:rm -f file1 file2 some_file

使用$() 或 $() 引用变量

x := dudeall:echo $(x)echo  ${x}
#不好的做法,但是有效echo $x

习惯上使用第一种用法

目标
all目标

可以人为的制作一个 all 目标

all: one two threeone:touch one
two:touch two
three:touch threeclean:rm -f one two three

由于这是列出的第一个规则,因此如果调用 make 而未指定目标,则默认情况下它将运行

多目标
all:f1.o f2.o
f1.o f2.o:echo $@
# 相当于:
#f1.o
#	echo f1.o
#f2.o
#	echo f2.o 

$@ 是包含目标名称的自动变量

http://www.lryc.cn/news/25065.html

相关文章:

  • 日志框架以及如何使用LogBack记录程序
  • 集成RocketChat至现有的.Net项目中,为ChatGPT铺路
  • 王道操作系统课代表 - 考研计算机 第三章 内存管理 究极精华总结笔记
  • Cypher中的聚合
  • 图注意网络GAT理解及Pytorch代码实现【PyGAT代码详细注释】
  • 项目成本管理中的常见误区及解决方案
  • 墨天轮2022年度数据库获奖名单
  • 仓储调度|库存管理系统
  • Canvas入门-01
  • 运算符优先级
  • 微信小程序使用scss编译wxss文件的配置步骤
  • 一步一步教你如何使用 Visual Studio Code 编译一段 C# 代码
  • vue-cli中的环境变量注意点
  • 2.3数据类型
  • Kafka基本概念
  • 使用QueryBuilders、NativeSearchQuery实现复杂查询
  • taobao.open.account.update( Open Account数据更新 )
  • PT100铂电阻温度传感器
  • 蓝桥杯-本质上升序列
  • synchronized锁重入验证
  • 超简单的计数排序!!
  • 发现新大陆——原来软件开发根本不需要会编码(看我10分钟应用上线)
  • 【Leedcode】栈和队列必备的面试题(第二期)
  • Elasticsearch实战之(商品搜索API实现)
  • 剑指 Offer 14-剪绳子
  • 泰克示波器|MSO64示波器的应用
  • 1.4 黑群晖安装:SataPortMap和DiskIdxMap两种获取方式
  • JVM虚拟机概述(2)
  • Intel CSME 简述
  • 复位理论基础