【Linux】Linux项目自动化构建工具-make/Makefile

embedded/2024/9/23 4:32:39/

背景

1.会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
2.一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile
定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,
甚至于进行更复杂的功能操作。
3.makefile带来的好处就是–“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,
极大的提高了软件开发的效率。
4.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,
比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

理解

依赖例子

实例代码

C代码

#include <stdio.h>int main()
{print("hello Makefile\n");return 0;
}

Makefile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o
hello.s : hello.i gcc - S
hello.i - o hello.s hello.i : hello.c gcc - E hello.c - o hello.i

.PHONY : clean
clean :
rm - f hello.i hello.s hello.o hello

依赖关系

上面的文件 hello, 它依赖 hell.o
hello.o, 它依赖 hello.s
hello.s, 它依赖 hello.i
hello.i, 它依赖 hello.c

依赖方法

gcc hello.* - option hello.*, 就是与之对应的依赖关系

原理

make是如何工作的, 在默认的方式下,也就是我们只输入make命令。那么,

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,
    并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可
    以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果
    找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明
    make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
    件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
    而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,
    我就不工作啦。

项目清理

工程是需要被清理的

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

但是一般我们这种clean的目标文件,我们将它设置为伪目标, 用.PHONY 修饰, 伪目标的特性是,总是被执行的。可以将我们的 hello 目标文件声明成伪目标,测试一下。


http://www.ppmy.cn/embedded/100271.html

相关文章

wo是如何克服编程学习中的挫折感的?

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…

Linux:CentOS配置

一&#xff0c;安装VMware 这个可以通过官网获取 vmware下载 也可以联系我&#xff0c;我发给你 二&#xff0c;安装CentOS Centos官网找要下载的版本&#xff1a; https://vault.centos.org/ 阿里云镜像&#xff1a;https://mirrors.aliyun.com/centos-vault/?spma2c6h.13…

Excel数据提取技巧:快速整理非结构化数据

在Excel中快速整理非结构化数据&#xff0c;需要掌握一系列有效的数据提取技巧。以下是一些实用的方法和步骤&#xff0c;可以帮助你高效地处理非结构化数据&#xff1a; 1. 使用文本函数 Excel提供了多种文本函数&#xff0c;如LEFT、RIGHT、MID、FIND、SEARCH等&#xff0c…

CAsyncSocket类实现网络通信

CAsyncSocket类编程模型   在一个MFC应用程序中,要想轻松处理多个网 络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字的编程模型简述如下:   1、构造一个CAsyncSocket对象,并用这个 对象的Create…

运维学习————nginx2-配置详解及负载均衡

目录 一、配置文件详解 1.1、结构 1.2、重要配置解释 1.3、详细配置 全局配置 Events HTTP 服务器配置 server虚拟主机配置 location URL匹配配置 1.4、完整配置 二、负载均衡 2.1、概念 2.2、集群规划及实现 2.3、具体实现 2.3.1、克隆 2.3.2、修改tomcat1配…

“学会吊打面试官系列”8.12~8.24面试难点记录

一共面了三家小公司&#xff0c;以下为个人记录的比较重要的10道题目 redis大key是什么问题&#xff1f;如何避免&#xff1f; “大 Key”是指那些占用大量内存的键值对。大 Key 会导致各种性能问题&#xff0c;比如&#xff1a;内存消耗增大&#xff0c;性能影响增大&#x…

iOS 开发:Object-C 和 Swift 的区别 (AI问答)

一&#xff1a;语言类型的区别&#xff08;最主要区别&#xff09; object-c 是动态类型语言&#xff1b; swift是静态类型语言&#xff1b; 看一下AI的回答&#xff0c;很全面~~ Objective-C 和 Swift 的语言类型区别主要体现在以下几个方面&#xff1a; 1. 静态类型 vs. 动…

微信小程序获取当前位置并自定义浮窗

1、在腾讯地图api申请key&#xff08;添加微信小程序的appid&#xff09;。 每个Key每日可以免费使用100次&#xff0c;超过次数后会导致地图不显示。可以多申请几个Key解决。WebService API | 腾讯位置服务腾讯地图开放平台为各类应用厂商和开发者提供基于腾讯地图的地理位置…