Linxu自动化构建工具make/Makefile究竟时什么?

Linxu自动化构建工具make/Makefile究竟时什么?

  • 一、简介
  • 二、makefile文件制作(简洁版)
    • 2.1 源文件
    • 2.2 makefile如何制作
      • 2.2.1 依赖关系、依赖方法
      • 2.2.3 伪目标(清理文件资源)
  • 三、make/Makefile自动化原理
    • 3.1 伪目标为什么可以重复执行?
    • 3.2 make如何工作?
  • 四、Makefile简介版本
    • 4.1 版本一
    • 4.2 版本二
    • 4,3 版本三

一、简介

 在一个大型工程中,源文件不计其数。按照文件类型、功能、模块不同,放在不同的目录下。但哪些文件先编译,哪些文件后编译,哪些文件需冲重新编译,甚至更为复杂的功能操作,如果依靠程序员自身来控制,不仅效率低下,而且极其容易出错!为此,自动化构建工具诞生 —— make/Makefile
Makefile(或makefile)是一个脚本文件;而make是一个命令工具,用于解释Makefile中的指令,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。当我们在Makefile中一旦写好了编译方式,只需要一个make命令就可完成整个工程的自动化编译。

二、makefile文件制作(简洁版)

2.1 源文件

这里我们给出一段各位都记忆深刻的代码:(存在于code.c源文件中)

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

2.2 makefile如何制作

在工程中,最重要的就是通过源文件通过某种方式来形成可执行文件,以及项目资源的清理。现在的问题是如何通过makefile来达到上述目的呢?
我们只需要在Makefile文件中输入以下程序即可:(后续还会在修改)

mybin:code.c  #如果有多个源文件,code.c后可继续田间源文件 
	gcc code.c -o mybin #前面的空格只能按Tab键,不能输入4个空格(语法)
.PHONY:clean #伪目标                                                                                                                                                                   
clean:                         
	rm -f mybin

接下来我们来一一分析每段代码是什么意思,以及如何编写!

2.2.1 依赖关系、依赖方法

 第一行mybin:code.c 称为依赖关系冒号左边为目标文件;冒号左边为源文件(可以是多个)。
 第二行gcc code.c -o mybin称为依赖关系,及源文件通过何种方式来形成目标文件。需要特别注意的是:依赖关系前的空格只能通过Tab键实现,不可以是4空格或其他!!!

 比如假设我们需要通过main.c、code.c、test.c三个源文件通过gcc来编译形成mybin目标文件,所以代码为:

mybin:main.c code.c test.c 
	gcc main.c code.c test.c -o mybin

mybin:main.c code.c test.c 
	gcc -o mybin main.c code.c test.c  //(只需保证-o后紧跟的是目标文件即可)

2.2.3 伪目标(清理文件资源)

在上述代码中.PHONY:xxx文件名表示该目标文件为伪目标,表示该文件不需要依赖关系,并且总是被执行
现在我们分别运行伪目标文件和普通文件看看会发生什么?

【普通目标文件】:

请添加图片描述

【伪目标文件】:
请添加图片描述

 我们发现对于普通目标文件,一旦我们编译后就不能重复编译,否则会报make: ‘mybin' is up to date.;但对于伪目标文件来说可以重复执行。
 为什么会这样呢?

三、make/Makefile自动化原理

3.1 伪目标为什么可以重复执行?

在解决这个问题之前,我们需要先了解为什么普通目标文件不可以重复执行!

 在实际工程中,一个大型项目存在众多的源文件,我们需要对这些源文件进行编译形成可执行文件。但一旦编译好后,在下一次执行该文件时,我们只需要重新编译某些内容被修改过的源文件即可。如果每次执行都需要重新编译所有的源文件,不仅意义不大,还会导致效率大大降低!

那程序如何发现代码别修改过,需要重新编译了?

在Linux中,每个文件有3种时间:Access、Modify、change三种时间,分别代表文件被打开的时间、文件内容内修改的时间、文件属性被修改的时间。我们可以通过stat 文件名来查看文件的3种时间。
 其中,Access时间比较特殊。一般而言,一个文件被访问是非常频繁的。由于文件存在磁盘中,如果每次进入文件都修改文件的Access时间,这也意味着存在大量的访问磁盘的IO操作,变形的降低了操作系统的效率。为此,当代计算机一般都对更改Access时间做了次数限制,不同机器平台存在差异。只有达到一定次数时,才会修改Access时间
 由于我们最终目的是得到相应的可执行程序,所以我们可以通过对比源文件和可执行文件的Modify来判断哪些文件被修改过,需要重新编译。即源文件第一次形成可执行文件时,可执行文件的Modify > 源文件的Modify。一旦源文件内容被修改后,此时源文件Modify被修改为最新时间,此时源文件Modify > 可执行文件的Modify。而make如果识别到源文件Modify > 可执行文件的Modify,便会对源文件进行重新编译。

伪目标为什么可以重复执行?
 前面博主替代过,一旦文件通过.PHONY:文件名成为伪目标,此时该文件不在需要依赖关系。这也意味这该文件不需要对比任何时间,直接执行。即可以重复执行。

3.2 make如何工作?

 在默认情况下,只要我们输入make命令,此时make会在当前目录下查找名为Makefile或makefile的文件。如果找到,则它会将第一个目标文件作为最终的目标文件。
 如果第一个目标文件文件不存在,或是第一个目标文件所依赖的后面的 .o 文件的文件修改时间要比第一个目标文件新,那么,他就会执行后面所定义的命令来生成这个文件。如果第一个目标文件所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。
 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即,如果在找了依赖关系之后,冒号后面的文件还是不在,那么就不工作了。

四、Makefile简介版本

比如假设我们需要通过main.c、code.c、test.c三个源文件通过gcc来编译形成mybin目标文件,这里有3个版本。各位自行选择。

4.1 版本一

这个就是最简单版本,就不多说了。

mybin:code.c  
	gcc main.c、code.c、test.c -o mybin #前面的空格只能按Tab键,不能输入4个空格(语法)
.PHONY:clean #伪目标                                                                                                                                                                   
clean:                         
   rm -f main.c、code.c、test.c

4.2 版本二

在Makefile中,我们可以在指令前加上@符号,可以不在显示屏上回显文件执行的指令。同时$@表示冒号左边的目标文件,$^来表示冒号右边的所有源文件。
所以上述代码可修改如下:

mybin:main.c、code.c、test.c 
	gcc &^ -o $@ #前面的空格只能按Tab键,不能输入4个空格(语法)
.PHONY:clean #伪目标                                                                                                                                                                   
clean:                         
   rm -f target

4,3 版本三

在make/Makefile中,支持变量化处理。有点类似于宏替换,具体如下:

cc=gcc
target=mybin.exe
src=main.c code.c test.c
#使用上述变量时,我们仅需通过$(变量)即可使用

$(target):$(src)  
	$(cc) &^ -o $@ #前面的空格只能按Tab键,不能输入4个空格(语法)
.PHONY:clean #伪目标                                                                                                                                                                   
clean:                         
   rm -f target

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lua 篇(一)— 安装运行Hello World

目录 前言一、Lua 是什么&#xff1f;二、Lua和C#的区别三、安装 LuaLinux 系统上安装Mac OS X 系统上安装Window 系统上安装emmyluaRider 安装(推荐) 四、Lua学习资料 前言 Lua 是一种轻量级的嵌入式脚本语言&#xff0c;它可以与 C 语言无缝集成&#xff0c;提供了强大的编程…

程序员的金三银四求职宝典:如何在关键时期脱颖而出?

个人主页&#xff1a;17_Kevin-CSDN博客 随着春天的脚步渐近&#xff0c;程序员们的求职热潮也随之而来。在这个被称为“金三银四”的招聘季&#xff0c;如何从众多求职者中脱颖而出&#xff0c;成为了许多程序员关注的焦点。本文将为你提供一份全面的求职宝典&#xff0c;助你…

程序员眼中的“祖传代码”

引言 在IT界&#xff0c;特别是在Java项目中&#xff0c;“祖传代码”通常指的是那些经过长时间积累、由多位开发者共同维护、且蕴含深厚技术沉淀的代码片段或模块。这些代码可能存在于项目的核心模块&#xff0c;也可能是一些辅助性的工具类。它们承载着项目的历史&#xff0…

vulhub中Wordpress 4.6 任意命令执行漏洞复现

由于Mysql初始化需要一段时间&#xff0c;所以请等待。成功运行后&#xff0c;访问http://your-ip:8080/打开站点&#xff0c;初始化管理员用户名和密码后即可使用&#xff08;数据库等已经配置好&#xff0c;且不会自动更新&#xff09;。 发送如下数据包&#xff0c;可见/tmp…

Kyuubi之Share Level

文章目录 Kyuubi介绍Spark thriftServer的问题Kyuubi架构 共享域参数CONNECTIONUSERGROUPSERVER Kyuubi介绍 Spark thriftServer的问题 STS面临以下的问题&#xff1a; 无法适应多租户场景。STS后端引擎仅仅启动一个application提供服务&#xff0c;提交用户和队列均为固定。…

Linux:Kubernetes(k8s)基础理论笔记(1)

我笔记来源的图片以及共享至GitHub&#xff0c;本章纯理论。这是k8s中部分的基础理论 &#x1f447; KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf&#x1f446; 什么是kubernetes kubernetes 是一个开源的&#xff0c;用于管…

TikTok企业认证教程:提升账号可信度的必备步骤

TikTok企业认证是TikTok平台用来验证账号真实性和权威性的方式。通过企业认证之后&#xff0c;企业能在TikTok上获得官方标识&#xff0c;可以增强品牌的专业形象&#xff0c;也有利于提升用户对企业内容的信任度。而且通过TikTok企业认证还可以解锁高级功能&#xff0c;如数据…

第105讲:Mycat垂直分表实战:从规划到解决问题的完整指南

文章目录 1.垂直分表的背景2.垂直分表案例实战2.1.垂直分表规划2.2.配置Mycat实现垂直分表2.3.重启Mycat2.4.在Mycat命令行中导入数据结构2.5.查看由Mycat分表后每个分片上存储的表2.6.Mycat垂直分表后可能遇到的问题2.7.垂直分表完成 1.垂直分表的背景 我们的商城系统数据库&…

基于springboot实现乐器社区网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现乐器社区网站系统演示 摘要 音乐一直以来都是人们非常喜爱的一种休闲娱乐的方式&#xff0c;人们在聆听音乐时可以全身心的进行放松&#xff0c;从音乐中可以获得认同感&#xff0c;可以与音乐进行情感的交流。而音乐的组成形式也是多样的&#xff0c;现代…

AP8854 DC-DC降压恒压 12V 6A过EMI线路图 宽电压电源管理IC

产品描述 AP8854 一款宽电压范围降压型 DC-D电源管理芯片&#xff0c;内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能&#xff0c;非常适合宽电压输入降压使用。AP8854 带使能控制&#xff0c;可以大大节省外围器件&#xff0c;更加适合电池…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类&#xff0c;可能会这样子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

Hackthebox - Authority

#ansible #Certify 赛博雨天&#xff1a;https://yutianqaq.github.io/ Recon smb smbmap -H 10.10.11.222 -u 挂载 smb 到 kali mount -t cifs //10.10.11.222/Development ./smb -o usernamesmb 在 cat smb/Automation/Ansible/PWM/defaults/main.yml 得到 ansible 的加…

循环队列与循环双端队列

文章目录 前言循环队列循环双端队列 前言 1、学习循环队列和循环双端队列能加深我们对队列的理解&#xff0c;提高我们的编程能力。 2、本文循环队列使用的是数组&#xff0c;循环双端队列用的是双向链表 3、题目连接&#xff1a;设计循环队列 &#xff0c;设计循环双端队列。 …

2024高频前端面试题 HTML 和 CSS 篇

JS和ES6 篇&#xff1a; ​​​​​​​2024高频前端面试题 JavaScript 和 ES6 篇-CSDN博客 一 . HTML 篇 1. H5有什么新特性 1) 语义化标签 用正确的标签做正确的事情。 html 语义化让页面的内容结构化&#xff0c;结构更清晰&#xff0c;便于对浏览器、搜索引擎解析&…

Springboot实现缓存预热

很多时候我们代码中使用缓存时都是先判断缓存中没有数据我们再读取数据库而有则直接使用缓存数据&#xff0c;而在系统冷启动(当系统重启或新启动时&#xff0c;缓存是空的&#xff0c;这被称为冷启动)时&#xff0c;我们毫无意外都是直接获取数据库的内容&#xff0c;这时候缓…

Pytorch Geometric 将表格数据集(CSV 文件)转换为图形数据集

导 读 如今图数据集正在以惊人的速度出现&#xff0c;所有化学分子、社交网络和推荐系统主要以图数据结构的形式存储数据 有需要的朋友关注公众号【小Z的科研日常】&#xff0c;获取更多内容。 01、如何转换CSV文件至图形数据结构 确定图形数据所需的基本信息 节点&#xff08;…

ViT的若干细节

之前只看了ViT的大概结构&#xff0c;具体的模型细节和代码实现知之甚少。随着ViT逐渐成为CV领域的backbone&#xff0c;有必要重新审视下。 patch -> token 为了将图片处理成序列格式&#xff0c;很自然地想到将图片分割成一个个patch&#xff0c;再把patch处理成token。 …

Go-知识struct

Go-知识struct 1. struct 的定义1.1 定义字段1.2 定义方法 2. struct的复用3. 方法受体4. 字段标签4.1 Tag是Struct的一部分4.2 Tag 的约定4.3 Tag 的获取 githupio地址&#xff1a;https://a18792721831.github.io/ 1. struct 的定义 Go 语言的struct与Java中的class类似&am…

数据结构c版(2)——二叉树

本章我们来了解一下二叉树这一概念。 目录 1.树概念及结构 1.1树的概念​​​​​​​ 1.2 树的特点&#xff1a; 1.3 树的相关概念 1.4 树的表示​​​​​​​ 1.5 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 …

华为云命令行工具KooCLI—高效云端管理的秘诀

做运维多年&#xff0c;公司从传统运维改为云上。刚一接触时&#xff0c;确实因为要学习很多云知识而烦恼。每次想要执行某个操作时&#xff0c;都要先登录到云平台&#xff0c;浏览界面&#xff0c;寻找正确的按钮。这样不仅浪费时间&#xff0c;还经常出错。直到有一天&#…
最新文章