Makefile学习笔记(一)

news2024/11/20 1:44:19

背景

最近在看ATF代码的时候,想要编译下,实施起来遇到一些问题,其中makefile有些命令,语法不是很清晰,故希望重新系统学习下。学习主要参考跟我一起写Makefile-陈皓.pdf。

第一部分、概述

makefile解决的问题:实现高效(控制文件是否编译,以及编译先后顺序等),自动化编译。

makefile的本质核心:文件依赖性

第二部分、关于程序的编译和链接

第三部分、 Makefile 介绍

核心思想:

1)如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
2)如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目
标程。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件,
并链接目标程序。

  一、 Makefile 的规则

target ... : prerequisites ...
    command
    ...
    ...

 target:规则的目标;可以是目标文件,可以是执行文件,也可以是个标签

prerequisites:生成target所需要的文件或目标

command:规则的命令行;是make程序所有的执行动作;一个规则可以有多个命令行,每一条命令占一行;注意:每一个命令行必须以[Tab]字符开始,[Tab]字符告诉 make 此行是一个命令行。 make 按照命令完成相应的动作。这也是书写Makefile 中容易产生,而且比较隐蔽的错误。

总结:target依赖于prerequisites的文件,其生成规则在command中进行定义

  二、 Makefile 是如何工作的

通常情况下,在命令窗口中输入make命令:

1、make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它会找文件中的第一个目标文件(target)并把这个文件作为最终的目标文件,然后基于规则进行生成;如果没找到,则停止并提示"make: *** No targets.  Stop."

三、makefile 中使用变量

#定义变量objects 
objects := main.o kbd.o command.o display.o

#变量引用
$(objects)

四、makefile 自动推导

只要 make 看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果 make找到一个 whatever.o,那么 whatever.c,就会是 whatever.o 的依赖文件。故目标文件的依赖在makefile中不必显式的列出。上述是makefile的“隐晦规则”

五、清空目标文件的规则

不要放在文件的开头,否则其会变成 make 的默认目标

第四部分、 Makefile 总述

一、makefile里有什么?

1、显式规则

书写者,明确指出目标文件,依赖项,生成的命令。

2、隐晦规则

书写者利用make的自动推导功能,进行简化撰写

3、变量定义

类似C语言中的宏定义,当 Makefile 被执行时,其中的变量都会被扩展到相应的引用位置上。

4、文件指示

        1>Makefile 中引用另一个 Makefile,就像 C 语言中的include 一样

        2>根据某些情况指定 Makefile 中的有效部分,就像 C 语言中的预编译#if 一样

        3>定义一个多行的命令(后续补充)

5、注释
其注释是用“#”字符,如果你要在你的 Makefile 中使用“#”字符,可以用反斜框进行转义,如:“\#”
二、 Makefile 的文件名

 三、 引用其它的 Makefile

语法include <filename>

其功能类似于C语言中的#include

include 前面可以有空字符,但不能是[Tab]键开始;include 和<filename>可以用一个或多个空格隔开

 四、make 的工作方式

 第五部分、书写规则

规则包含两个部分:依赖关系和生成目标的方法。

Makefile 中应该只有一个最终目标,其它的目标都是被这个目标所连带出来的。

目录由“冒号”分隔

为了显式的指出目标仅仅是个标签而不是个文件,故通过一个特殊的标记“.PHONY”来显
示地指明

自动化变量:基于下面的代码进行描述“$<”表示所有的依赖目标集(也就是“foo.c bar.c”), “$@”表示目标集(也就是“foo.o bar.o”)

objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

周期矩形波的傅里叶级数展开(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 当脉冲信号周期不变&#xff0c;脉冲宽度变大时&#xff0c;相邻谱线间隔不变&#xff0c;频谱包络线的零点频率逐渐变小&…

git查看分支、创建分支、合并分支

一、查看的git命令如下&#xff1a; git branch 列出本地已经存在的分支&#xff0c;并且当前分支会用*标记 git branch -r 查看远程版本库的分支列表 git branch -a 查看所有分支列表&#xff08;包括本地和远程&#xff0c;remotes/开头的表示远程分支&#xff09; git bran…

9、位和逗号的运算符与表达式

目录 一、位逻辑运算符与位逻辑表达式 1. 位逻辑运算符 2. 位逻辑表达式 二、逗号运算符与逗号表达式 一、位逻辑运算符与位逻辑表达式 1. 位逻辑运算符 位逻辑运算符包括位逻辑与、位逻辑或、位逻辑非和取补 注意&#xff1a;表中除了最后一个运算符是单目运算符外&…

PC 性能自动化工具技术方案及说明

● 需求背景 Kim PC端在每一个版本的迭代过程中&#xff0c;由于各版本的功能改动较多&#xff0c;为了避免在发布新版本时性能不会出现“大跳水”的情况&#xff0c;需要针对每一个版本进行性能测试。由于人工手动测试所需时间较长&#xff0c;且存在参数不准确、时间不可控等…

基于Java+SpringBoot+vue+element驾校管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

详解vue组件(属性、事件和插槽)

一、属性 1.自定义属性props 可以得出props 可以显示定义一个或一个以上的数据&#xff0c;对于接收的数据&#xff0c;可以是各种数据类型&#xff0c;同样也可以传递一个函数。通过一般属性实现父向子通信&#xff1b;通过函数属性实现子向父通信 2.inheritAttrs 3. data与…

十、顺序存储二叉树、线索化二叉树

1、二叉树顺序存储 1.1 特点 顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n1第n个元素的右子节点为2*n2第n个元素的父节点为(n-1)/2 n&#xff1a;表示二叉树中的第几个元素&#xff08;按0开始编号&#xff09;&#xff0c;也可以理解为n为数组下标。 1.2、基本…

力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串…

Apache两个解析漏洞复现及防御方法

一、多后缀解析漏洞 形成原因&#xff1a; 配置apache时&#xff0c;对于apache配置不熟练&#xff0c;配置命令不清楚&#xff0c;在配置PHP文件处理程序时&#xff0c;配置命令存在问题&#xff1a;位于漏洞环境目录的 conf/docker-php.conf里的配置命令&#xff08;AddHand…

路由策略实验(华为)

题目&#xff1a; 思路&#xff1a; 为完成实验达成目的&#xff0c;需要明确两个区域内的协议&#xff0c;并且要避免造成环路&#xff0c;故需要改变r3-r1,r3-r4两边的优先级&#xff0c;可以避免造成环路&#xff0c;并且需要达到选路最优&#xff0c;设置匹配规则&#xff…

【机器学习】逻辑回归(实战)

逻辑回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、绘制 sigmoid 函数&#xff1a;σ(z)11e−z\sigma(z)\frac{1}{1e^{-z}}σ(z)1e−z1​三、查看鸢尾花数据集1、加载 iris 数据集并查看2、设计二分…

[Java]Maven学习笔记(尚硅谷2022)

文章目录&#x1f97d; Maven概述&#x1f30a; Maven的功能&#x1f30a; Maven简介&#x1f4a6; 构建&#x1f4a6; 依赖&#x1f4a6; Maven 的工作机制&#x1f97d; Maven核心程序解压和配置&#x1f30a; Maven 核心程序解压与配置&#x1f4a6; 下载&#x1f4a6; 解压…

电脑本地安装不同版本MySQL

本地已经安装了mysql5.7版本&#xff0c;想测试mysql8版本的用法&#xff0c;想在一台电脑同时配置不同版本的mysql在不同端口号&#xff0c;看起来简单&#xff0c;实现起来其实挺多坑的&#xff0c;总结下实战经验和大家分享下 一、下载安装 下载地址 二、配置 1、解压缩…

word标签功能:如何快速制作批量产品贴纸标签

在日常生活中&#xff0c;在商店购物时&#xff0c;经常可以看到&#xff0c;商品架上放有产品贴纸标签&#xff0c;用于消费者识别产品价格、日期或者组合成分等。在日常办公中&#xff0c;在办公用品或仓库物料上&#xff0c;同样也能看到贴纸标签&#xff0c;用于物品的分类…

Go语言安装

1. 介绍 Go语言是一门编译型语言。Go的语法接近C语言&#xff0c;但对于变量的声明有所不同。Go支持垃圾回收功能。 C/C&#xff1a;C/C语言直接编译成机器码&#xff0c;不需要执行环境&#xff0c;直接执行在操作系统上&#xff1b; Java&#xff1a;Java会先编译成字节码.c…

es6对象中的简写形式

对象属性简写 let name ww; let age 18; // es5写法 let es5 {name: name,age: age, }; // es6写法 let es6 {name,age }函数简写 let obj {es5: function () {}, // es5写法es6() {} // es6写法&#xff0c;省略 :function }计算属性名 let name ww; let age 18 let o…

前后端鉴权的10种方案

文章目录0、基本概念认证授权鉴权权限控制认证、授权、鉴权和权限控制的关系1. HTTP 基本鉴权1.1 认证流程图1.2 认证步骤解析1.2 认证步骤解析1.3 优点1.4 缺点1.5 使用场景2. Session-Cookie 鉴权2.1 什么是 Cookie2.2 什么是 Session2.3 Session-Cookie 的认证流程图2.4 Ses…

一起Talk Android吧(第四百七十八回:旋转类视图动画)

文章目录使用方法属性介绍示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"平移类视图动画",这一回中咱们说的例子是"旋转类视图动画"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 使用方法 旋转类动画…

【Java项目】从0到1构建一个博客系统

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:从0到1构建一个博客系统&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;博客系统源码托管&#xff01; ⛵…

【Git】自建代码托管平台-GitLab

10.1、GitLab 简介 GitLab 是由 GitLabInc.开发&#xff0c;使用 MIT 许可证的基于网络的 Git 仓库管理工具&#xff0c;且具有wiki 和 issue 跟踪功能。使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的 web 服务。 GitLab 由乌克兰程序员 DmitriyZaporozhets …