Makefile

2023-05-16

1.基本规则

目标:依赖                                            目标:要生成的目标文件

(tab)命令                                             依赖:目标文件由那些文件生成

                                                            命令:通过执行该命令由依赖文件生成目标

举例 :

add.o:add.c

        gcc -c add.c -o add.c  

(1)其他规则

  • 目标的时间必须晚于依赖条件的时间,否则更新目标
  • 依赖条件如果不存在 , 则去找新的规则产生依赖
  • ALL:指定makefile的终极目标 , 否则make命令只会执行第一个目标

                 

(2)当某一个cpp文件被修改,编译器如何知道

目标文件是通过依赖文件生成的 , 所以目标文件生成时间晚于依赖文件 ; 所以make的时候依次将目标文件和依赖文件时间进行对比 , 如果依赖文件的修改时间 > 目标文件说明依赖文件被修改了, 就需要重新生成目标文件

        

(3)补充

  • 推荐先编译成 .o文件,最后再进行链接 : 当某一个文件改变,我们只需要重新生成那一个 .o目标文件 , 再链接起来 ,剩下的文件就不需要重新编译 , 提高效率.
  • 如果某个目标的依赖文件被修改了, make会重新生成该目标,执行对应命令 ;否则该目标不会被重新生成

        

(4)make原理

  • make会在当前目录下找名字为“Makefile”或“makefile”的文件。
  • 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
  • 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新,那么它就会执行后面的依赖方法来生成mytest文件。
  • 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
  • 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
  • make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  • 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错。

                

                        

2.Makefile函数

(1) src = $(wildcard *.c)

  • 将当前目录下所有的后缀为 .c的文件赋值给src , 将文件名组成列表, 赋值给src
  • 相当于取出某一后缀的所有文件

                

(2) obj = $(patsubst %.cpp, %.o, $(src)) 

  • %是通配符, 匹配字符串
  • 把src变量里所有后缀为 .cpp 的文件替换成 .o
  • 将参数3中包含参数1的部分,替换为参数2

                

                

3.补充 

 (1)三个自动变量

  • $@ : 在规则的命令中,表示规则中的目标。
  • $^ : 在规则的命令中,表示所有依赖条件
  • $< : 在规则的命令中,表示第一一个依赖条件。 如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则

                 

(2)伪目标

  • 伪目标可以没有依赖
  • .PHONY后面接伪目标,clean就是伪目标,伪目标:依赖方法总是被执行

                

(3)参数

① -n : 模拟执行make命令, 实际不执行,只是展示命令

                

②-f : 指定文件执行make 命令

                 

                        

4.实例 

                        

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile 的相关文章

  • 如何在 GNU Make 的定义中使用 ifeq?

    我正在尝试在 Makefile 中的定义内执行 ifeq 但我似乎遇到了一些错误 并且我想知道是否遗漏了某些内容 我有以下 Makefile info start ifeq X Y info DOES not appear 1 endif
  • 如何制作轨道时间戳

    make 如何保留文件的时间戳 我正在尝试将我的 git 存储库部署到位 我正在为大多数不会改变的文件添加预编译的二进制文件 现在 当我从 git 签出存储库时 我不想编译这些 c 文件 我想使用这些预构建的二进制文件 因此 为了设置这个方
  • make: *** 没有规则可以创建“all”所需的目标“gcc”。停止

    我正在通过一个eg pgm 来创建一个make 文件 http mrbook org tutorials make http mrbook org tutorials make 我的文件夹eg make creation包含以下文件 des
  • bash:PWD 和 CURDIR 有什么区别?

    我的问题 我使用 Makefile 来运行docker runtarget 需要当前工作目录作为其参数之一 我使用任一 PWD or CURDIR build Dockerfile docker run lt PWD or CURDIR g
  • Readelf 报告程序是共享库而不是可执行文件

    使用独立的 Android NDK r10e 工具链 使用 toolchain x86 clang3 6 开关构建 出现这种奇怪的行为 交叉编译的环境变量已设置在运行makefile之前 SYSROOT指向Android工具链位置 CXX等
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • 在 Makefile 的先决条件列表中使用目标的目录路径

    我编写了一个脚本 它接收两个以 cfg 结尾的文件并输出一个以 cmp 结尾的文件 我想将其包含在我的 Makefile 中 因为一些源代码文件依赖于此 cmp 文件 在我的 Makefile 中 我想这样做 cmp cfg dir def
  • mingw32-make 的目录更改错误

    我正在MinGW32下构建POCO库1 6 0 环境 Windows 7 Ultimate 32位 shell MSYS 执行成功 配置 configure Configured for MinGW config make的内容 POCO
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • 避免重复 GNU Make 规则

    我一直在编写一个执行一些依赖项生成的 Makefile 我发现自己必须重复规则 因为 遗留 代码库包含以下内容的混合 cpp and cc文件 好像有点难看 无论如何 是否可以指定目标的先决条件可以是 cpp or cc files 所以而
  • 为什么总是./configure;制作;进行安装;作为 3 个单独的步骤?

    每次从源代码编译某些内容时 都会经历相同的 3 个步骤 configure make make install 我明白 将安装过程分为不同的步骤是有意义的 但我不明白 为什么这个星球上的每个编码员都必须一次又一次地编写相同的三个命令才能完成
  • 具有两个同名目标的 Makefile

    我有一个包含包含语句的 makefile 我无法控制包含的 makefile 的内容 不过 我希望能够在 某些 不是全部 目标之前添加一些预处理步骤 考虑以下示例 install echo install target include ot
  • 使用 .INTERMEDIATE 在 makefile 中进行不可靠的并行构建?

    我有一个可以生成多个输出文件的工具 众所周知 在 make 中很难建模 我正在使用食谱GNU Makefile 规则从单个源文件生成一些目标 https stackoverflow com questions 2973445 gnu mak
  • 安装 libjpeg v8 到 /opt/local

    如何在 OSX 上将 libjpeg 8 安装到 opt local 我问的原因是我想用以下方法制作大脑活动的小电影MNE C 库 http www nmr mgh harvard edu martinos userInfo data MN
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 致命错误:向量:没有这样的文件或目录

    我有一个 Android 项目 其中包含大量 C 本机代码 但是 我无法构建我的库 因为它无法找到 vector h 头文件 可能是什么问题 我在几乎所有页面中包含的示例 include
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2

随机推荐

  • 用python写DFS和BFS算法

    前言 xff1a 菜鸟学算法 加油 xff01 一 什么是DFS和BFS xff1f 1 BFS算法 xff1a 宽度优先搜索算法 xff08 又称广度优先搜索 xff09 是最简便的图的搜索算法之一 xff0c 这一算法也是很多重要的图的
  • 进程同步 生产者消费者问题

    题目 xff1a 某超级市场 xff0c 可容纳100人同时购物 入口处备有篮子 xff0c 每个购物者可持一只篮子入内购物 出口处结帐 xff0c 并归还篮子 xff08 出 入口仅容一人通过 xff09 请试用P xff08 S xff
  • Windows-取消锁屏密码

    开始 gt 设置 gt 账户 gt 登录选项 gt 密码 gt 输入当前密码 gt 更改密码 xff08 默认为空就行 xff09 gt 下一步 gt 完成
  • 腾讯云4核服务器和2核区别大吗?性能差异

    腾讯云服务器2核和4核性能有什么区别 xff1f 云服务器核数指的是vCPU处理器 xff0c 云服务器CPU核心数如何选择主要取决于用户实际应用情况 xff0c 如果当前应用对CPU计算能力要求不高 xff0c 2核完全可以胜任 xff0
  • 最详细的手工LAMP环境搭建

    环境 xff1a 阿里云服务器ECS xff0c Alibaba Cloud Linux 3 2104 LTS 64位 xff0c 2核 vCPU 2 GiB LAMP 是搭建Web应用时最常用的环境 xff0c LAMP 分别表示 Lin
  • python 语音播报 简单入门

    coding utf 8 import pyttsx3 import time 初始化 pt 61 pyttsx3 init 说什么 pt say 34 你好 xff0c dbirder 34 开始说吧 pt runAndWait time
  • 【optimizer详解】

    optimizer 定义 optimizer就是在深度学习反向传播过程中 xff0c 指引损失函数 xff08 目标函数 xff09 的各个参数往正确的方向更新合适的大小 xff0c 使得更新后的各个参数让损失函数 xff08 目标函数 x
  • docker网络配置

    开放容器端口 执行docker run的时候有个 p选项 xff0c 可以将容器中的应用端口映射到宿主机中 xff0c 从而实现让外部主机可以通过访问宿主机的某端口来访问容器内应用的目的 p选项能够使用多次 xff0c 其所能够暴露的端口必
  • Ubuntu使用SSH工具默认用root用户连接;解决SSH不能用root用户连接。

    ROOT是什么意思 xff1f Root xff0c 也称为根用户 xff0c 是Unix 如 Solaris AIX BSD xff09 和类UNIX系统 如 Linux QNX 等 xff0c 及Android和iOS移动设备系统中的唯
  • LeetCode55. 跳跃游戏(贪心)

    力扣 解题思路 xff1a 1 设想一下 xff0c 对于数组中的任意一个位置 y xff0c 我们如何判断它是否可以到达 xff1f 根据题目的描述 xff0c 只要存在一个位置 x xff0c 它本身 可以到达 xff0c 并且它跳跃的
  • LeetCode300. 最长递增子序列(动态规划 / 贪心)

    力扣 解题思路 xff1a 1 动态规划 状态定义 xff1a dp i 的值代表 nums 以 nums i 结尾的最长子序列长度 转移方程 xff1a 设 j 0 i j 0 i xff0c 考虑每轮计算新 dp i 时 xff0c 遍
  • LeetCode299. 猜数字游戏

    力扣 解题思路 1 使用一个vector flag 记录哪个位置的下的字符相同 xff0c 使用一个Hash map记录secret中剩余字符与次数的映射 2 遍历guess 找到guess中的字符与 secret 相同但是在不同位置的字符
  • 八大排序 - (详解)

    目录 一 直接插入排序 1 思想 2 实现 3 特性总结 二 希尔排序 1 思想 2 实现 3 特性总结 三 选择排序 1 思想 2 实现 3 特性总结 四 堆排序 1 思想 2 实现 3 特性分析 五 冒泡排序 1 思想 2 实现 3 特
  • 牛客 - 另类加法

    另类加法 解题思路 1 二进制位异或运算相当于对应位相加 xff0c 不考虑进位 比如 xff1a 1 1 61 0 gt 1 43 1 61 0 当前位值为0 xff0c 进一位 1 0 61 1 gt 1 43 0 61 1 当前位值为
  • Jmeter添加MD5方法插件

    1 xff1a 下载 https jmeter plugins org install Install 2 xff1a jmeter plugins manager 1 3 jar放到 apache jmeter 5 0 lib ext目录
  • Linux常用指令(详解)

    目录 1 ls指令 2 pwd 3 clear 4 whoami 5 cd 6 tree 7 mkdir 8 touch 9 rmdir 10 rm 11 man 12 cp 13 mv 14 cat 15 more 16 less 17
  • 进程间通信详解

    目录 一 进程间通信介绍 1 进程间通信的目的 2 进程间通信的本质 3 进程间通信分类 二 什么是管道 三 匿名管道 1 匿名管道只能用于具有亲缘关系的进程之间进行通信 xff0c 常用于父子 2 pipe函数 3 匿名管道的使用 4 管
  • 大厂笔试真题

    1 复数相乘 2 K个一组翻转链表 include lt iostream gt include lt vector gt include lt string gt using namespace std void Reverse vect
  • 文件系统概念

    1 文件逻辑结构 1 有结构文件和无结构文件 定长记录 可变长记录 2 顺序文件 3 索引文件 4 索引顺序文件 5 多级索引顺序文件 2 文件目录 1 文件控制块 2 目录结构 3 索引节点 3 文件的物理结构 1 文件块 xff0c 磁
  • Makefile

    1 基本规则 目标 依赖 目标 要生成的目标文件 tab 命令 依赖 目标文件由那些文件生成 命令 通过执行该命令由依赖文件生成目标 举例 add o add c gcc c add c o add c 1 其他规则 目标的时间必须晚于依赖