Linux - make/Makefifile

news2024/9/23 13:25:22

0.背景

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

1.依赖关系和依赖方法

依赖关系

上面的文件

myfile ,它依赖 myfile.o
myfile.o , 它依赖 myfile.s
myfile.s , 它依赖 myfile.i
myfile.i , 它依赖 myfile.c

依赖方法

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

2.原理

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

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

3.项目清理

工程是需要清理的

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,
不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
可以将我们的test目标文件声明成伪目标,测试一下。

未加.PHONY 修饰,不可以一直make

加了.PHONY 修饰

可以一直make了

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

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

相关文章

【Spring】Spring之循环依赖底层源码解析

什么是循环依赖 A依赖了B,B依赖了A。 示例: // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }其实,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。示例: A a new A(); B b new B…

5分钟快手入门laravel邮件通知

第一步: 生成一个邮件发送对象 php artisan make:mail TestMail 第二步: 编辑.env 添加/修改(没有的key则添加) MAIL_DRIVERsmtp MAIL_HOSTsmtp.163.com (这里用163邮箱) MAIL_PORT25 (163邮箱…

Bug记录: CUDA error_ device-side assert triggered

Bug记录: CUDA error: device-side assert triggered 在接触AIGC算法的过程中偶尔会遇到这样的bug:RuntimeError: CUDA error: device-side assert triggered return torch._C._cuda_synchronize() RuntimeError: CUDA error: device-side assert trig…

Qt实现引导界面UITour

介绍 最近做了一款键鼠自动化,想第一次安装打开后搞一个引导界面,找了好多资料没啥参考,偶然发现qt有引导界面如下图。 Qt整挺好,但是未找到源码,真的不想手撸,无奈实在找不到,下图是仿照qt实现…

在Vue中使用深度选择器定制Element Plus组件样式

介绍: 在Vue.js开发中,我们经常使用Element Plus作为UI组件库,它提供了丰富的组件供我们使用。然而,有时候我们希望对Element Plus的组件样式进行一些定制,比如调整字体大小、改变颜色等。在这篇博客中,我…

【GitOps系列】如何实施金丝雀发布?

文章目录 前言金丝雀发布概述金丝雀实战创建生产环境 部署金丝雀环境配置金丝雀策略金丝雀发布自动化创建 Rollout 对象创建 Service 和 Ingress 对象访问生产环境金丝雀发布自动化 访问 Argo Rollout Dashboard自动化原理结语 前言 蓝绿发布是一种通过资源冗余来换取回滚效率的…

关于jar文件反编译

最近在搞tck测试,想要将其日志转换成apdu脚本,结果出现默认输出最大长度不足,输出被省略现象。 软件log出现的错误信息 ... Output overflow: JavaTest Harness has limited the test output to the text to that at the beginning and the…

stable-diffusion-webui 启动服务,卡在浏览器loading中, 重定向解决

最新的code,按步骤安装,趟完pip和github的坑,终于启动服务 然后悲催的卡在浏览器这一步,一直在loading,折腾一下午,尝试可能有效的步骤,也许最后一步才有用: 1. 启动IIS服务 2. 配…

Java课题笔记~Maven基础

2、Maven 基础 2.1 Maven安装与配置 下载安装 配置:修改安装目录/conf/settings.xml 本地仓库:存放的是下载的jar包 中央仓库:要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目

爬虫006_python中的运算符_算术运算符_赋值运算符_复合赋值运算符_比较运算符_逻辑运算符_逻辑运算符性能提升---python工作笔记024

首先看加减乘除 然后看这里的 // 是取整数部分,不是四舍五入 然后%这个是取余数 然后**是,几次方那种 指数

游游的排列构造

示例1 输入 5 2 输出 3 1 5 2 4 示例2 输入 5 3 输出 2 1 4 3 5 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int n,k; int main(){scanf("%d%d",&n,&k);int xn-k1;int yn-k;int f1;for(int i1;i&l…

八大排序算法--希尔排序(动图理解)

目录 希尔排序 概念 算法思路 动画演示 代码如下 复杂度分析 时间复杂度测试 运行结果 完整代码 创作不易&#xff0c;如果本篇博客对您有一定的帮助&#xff0c;大家记得留言点赞哦。 希尔排序 概念 希尔排序是插入排序的一种&#xff0c;是对直接插入排序的优化。其…

Docker基础命令(一)

Docker使用1 一、运行终端 打开终端&#xff0c;输入docker images &#xff0c;如果运行正常&#xff0c;表示docker已经可以在本电脑上使用了 二、docker常用命令 指令说明docker images查看已下载的镜像docker rmi 镜像名称:标签名删除已下载的镜像docker search 镜像从官…

Python3.9.17配置openssl

下载python3.9.17和openssl3.1.1的安装包 wget https://www.python.org/ftp/python/3.9.17/Python-3.11.4.tgz wget https://www.openssl.org/source/openssl-3.1.1.tar.gz# 解压 tar -xzf openssl-3.1.1.tar.gz tar -xzf Python-3.9.17.tgz 1、安装openssl cd openssl-3.1.…

手机/平板电脑作为pc电脑扩展屏——Splashtop Wired XDisplay使用教程

Splashtop Wired XDisplay使用教程 写在前面这个软件能做什么软件安装开始使用如何拓展屏幕Wired XDisplay 找不到第二个屏幕或点击扩展没反应怎么办&#xff1f;Wired XDisplay扩展屏黑屏怎么办 写在前面 一直想买一个扩展屏&#xff0c;但实际需求使用的次数并不是很多。所以…

js全端支持的深拷贝structuredClone

Jul 7, 2023 经过一年半的试用&#xff0c;structuredClone转正了&#xff0c;全端可以正式使用。 https://developer.mozilla.org/en-US/docs/Web/API/structuredClone

ansible安装lnmp(集中式)

文章目录 一、安装nginx二、安装mysql三、安装php测试&#xff1a; 一、安装nginx - name: the nginx playhosts: webserversremote_user: roottasks:- name: stop firewalld #关闭防火墙service: namefirewalld statestopped enabledno- name: selinux stopc…

2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。

2023-07-31&#xff1a;用r、e、d三种字符&#xff0c;拼出一个回文子串数量等于x的字符串。 1 < x < 10^5。 来自百度。 答案2023-07-31&#xff1a; 大体步骤如下&#xff1a; 1.初始化一个字符串builder&#xff0c;用于构建结果字符串。 2.初始化一个字符变量c…

【SpringBoot】| SpringBoot 和 web组件

目录 一&#xff1a;SpringBoot 和 web组件 1. SpringBoot中使用拦截器&#xff08;重点&#xff09; 2. SpringBoot中使用Servlet 3. SpringBoot中使用过滤器&#xff08;重点&#xff09; 4. 字符集过滤器的应用 一&#xff1a;SpringBoot 和 web组件 1. SpringBoot中使…

yellowbrick:一款特征工程可视化神器!

在建立模型之前一个非常重要的工作就是做特征工程&#xff0c;而在特征工程的过程中&#xff0c;探索性数据分析又是必不可少的一部分。 本次介绍一款功能十分强大的特征工程可视化工具&#xff1a;yellowbrick&#xff0c;包括雷达、一维排序、PCA、特征重要性、递归消除、正…