[Linux_]make/Makefile

news2024/11/13 21:26:33

[Linux_]make/Makefile

  • 心有所向,日复一日,必有精进
  • 专栏:《Linux_》
  • 作者:沂沐沐


 

目录

[Linux]make/Makefile

前言

         一、Mikefile

         二、如何写Mikefile文件

         三、原理

四、项目清理

报错:missing separator


前言

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


一、Mikefile

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

Makefile写好后,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

二、如何写Mikefile文件

下面是一个Text.c的文件:

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

Makefile:文件 

text:Text.c
    gcc Text.c -o text
.PHONY:clean
clean:
    rm -f text  

使用make指令:

 

 text:Text.o                                                                                                                                                                            
  2     gcc Text.o -o text 
  3 Text.o:Text.s
  4     gcc -c Text.s -o Text.o
  5 Text.s:Text.i
  6     gcc -S Text.i -o Text.s
  7 Text.i:Text.c
  8     gcc -E Text.c -o Text.i
  9 .PHONY:clean
 10 clean:
 11     rm -f text
  1.  预处理 选项 gcc -E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
  2. 编译 选项 gcc -S test.c编译完成之后就停下来,结果保存在test.s中。
  3.  汇编 gcc -c test.c汇编完成之后就停下来,结果保存在test.o中。

这就涉及到程序刚刚开始所涉及的

注意:在写Mikefile文件中可能会使用如下变量$@,$^,$<

$@,$^,$<代表的意义分别是: 

                   他们三个是十分重要的三个变量,所代表的含义分别是:

                   $@ —— 目标文件,$^ —— 所有的依赖文件,$< —— 第一个依赖文件。

三、原理

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

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

四、项目清理

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

报错:missing separator

 这个akefile里不要乱用TAB,只有命令所在的行才能且只能以TAB开头!

这种情况一般是中制表符Tab的问题,删除有问题的行中的制表符Tab重新输入即可。

Makefile中每个规则的所有操作都通过Tab识别,并且不会将4个空格识别为制表符Tab,只有制表符才识别为制表符。


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

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

相关文章

Linux 命令

最基础的命令 1.我是谁 我用什么账号登录 whoami 2.我在那 在那个目录下 pwd 3.环顾四周 1.ll展示详细信息 2.ls 展示文件名称 4.cd 想去那 改变目录 cd 回家 cd ./ 定位到当前目录 cd../ 上级目录 cd../../上两级目录。 5.切换用户 su 从普通用户切换到root用户的…

C#应用程序配置文件(XML序列化) - 开源研究系列文章

上次写了一个C#线程池及管理器的博文( C#开发的线程池和管理器 - 开源研究系列文章 )&#xff0c;收到了不小的浏览量&#xff0c;在此感谢各位网友的支持。这次将另一个功能放出来单独讲解&#xff1a;C#应用程序的配置文件&#xff0c;使用的是XML文件保存程序的配置信息&…

数据结构(栈、队列、链表)

文章目录前言数据结构(栈、队列、链表)1、栈2、队列3、链表3.1、单向链表结构3.2、双向链表结构前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&…

多边形点集排序

一、问题描述已知多边形点集P {P1, P2, ... , PN}&#xff0c;其排列顺序是杂乱&#xff0c;依次连接这N个点&#xff0c;无法形成确定的多边形&#xff0c;需要对点集P进行排序后&#xff0c;再绘制多边形。二、排序规则点集排序过程中&#xff0c;关键在于如何定义点的大小关…

STC32G 时钟系统

文章目录时钟系统代码配置总结时钟系统 系统时钟有4个时钟源可供选择&#xff1a; 内部高精度IRC内部32KHzIRC&#xff08;精度较低&#xff09;外部晶振内部PLL输出时钟 主要关心的是两个指标&#xff1a;SYSclk和HSCLK SYSclk是系统的时钟&#xff0c;决定了指令执行速度…

Android 深入系统完全讲解(三)

系统调用 操作系统提供了一些方法&#xff0c;让用户层可以调用&#xff0c;而为了安全起见&#xff0c;这些方法调用&#xff0c;都是在内核空间。于是&#xff0c;用户调用的时候&#xff0c;就会有个动作&#xff0c;叫做陷入内核。 当用户调用系统方法的时候&#xff0c;系…

【k8s-device plugin】如何编写 k8s device plugin

参考 Device Plugin 入门笔记&#xff08;一&#xff09; Device Plugin 入门笔记&#xff08;二&#xff09; 从零开始入门 K8s&#xff1a;GPU 管理和 Device Plugin 工作机制 Kubernetes开发知识–device-plugin的实现 https://github.com/oceanweave/cola-device-plugi…

基于springboot的智慧物业管理系统的设计与实现(前后端分离)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

mysql 中间件 mycat2 的详细安装及配置步骤

下载 首先打开mycat官网&#xff1a;MyCat2 右上角下载里面有个文件下载服务&#xff0c;点进去发现无法访问 这里需要配置一下host&#xff0c;把下面内容复制到host文件中。host文件位置在C:\Windows\System32\drivers\etc 210.51.26.184 mycat.org.cn www.mycat.org.cn …

第五篇 - 数组的劫持

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;对象属性的深层劫持是如何实现的 核心思路就是递归&#xff0c;主要流程如下&#xff1b; 1.通过 data isFunction(data) ? data.call(vm) : data;处理后的 data 一定是对象类型 2.通过 d…

如何定位Bug——Qt

1. 前言 在写程序的过程中&#xff0c;不可避免出现各种Bug&#xff0c;如何快速的定位到Bug的位置&#xff0c;是程序员必备的技能之一。 2. 几种方法 2.1. 逻辑分析 根据程序所出的问题&#xff0c;分析问题可能所在的几个位置&#xff0c;通过逻辑分析找出Bug&…

从 Nginx Ingress 窥探云原生网关选型

作者&#xff1a; 魁予 现今有越来越多的企业开始采纳云原生理念进行应用架构转型。而 K8s 和微服务是云原生的两大支柱&#xff0c;随着云原生浪潮而被广泛应用。 对多数应用而言&#xff0c;提供对外服务的使命并不会改变&#xff0c;相比于原来的单体应用&#xff0c;微服…

VUE3中,使用.env.development和.env.production

在实际项目开发过程中&#xff0c;可能开发环境和生产&#xff08;测试&#xff09;环境不一样&#xff0c;经常需要修改配置常量&#xff0c;才能满足对应的环境&#xff0c;才能使软件运行起来。在vue3中可以使用2个文件进行区分。 .env.development&#xff1a;开发环境 .…

Mysql存储引擎 初级(自用笔记)

内容来自于(https://www.bilibili.com/video/BV1Kr4y1i7ru?p58&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.存储引擎 1.1Mysql体系结构 1.2什么是存储引擎呢? 存储引擎就是存储数据,建立索引,更新,查询数据等技术的实现方式. 存储引擎是基于表的,而不是基于数据库的…

魔兽世界开服教程wow服务器框架Trinirycore构建

首先明杰先给各位普及一下TrinityCore是什么TrinityCore 是c实现MMORPG框架来自MaNGOS&#xff0c;大型网络对象服务&#xff0c;随着时间的推移&#xff0c;该项目代码广泛的优化&#xff0c;改善和清理代码。需要准备的架设工具&#xff1a;端&#xff08;版本&#xff09;、…

皮尔逊相关性分析一文详解+python实例代码

目录 前言 一、数值类型 二、皮尔逊系数使用场景 二、皮尔逊相关系数(Pearson correlation) 1.定义 2.线性关系判定 3.正态检验 1.KS检验 4.计算代码 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&#xff0c;非常感谢 参阅 前言 相关性…

MySQL中这10个小玩意,让人眼前一亮

我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

给Kylin iso中添加自定义rpm包

前言 在日常产品交付中会有如下需求&#xff1a; 客户自己安装centos / ubuntu / kylin iso&#xff0c;然后我们把rpm包给到客户 我们直接将rpm包封装到iso&#xff0c;给客户交付整体iso&#xff0c;这样不管是对于客户还是对于公司都是最省心的&#xff0c;会避免很多因为系…

疯狂2023:科技迎来爆发之年,关注云计算这些方向

临近年末&#xff0c;熬过艰难苦恨繁霜鬓的2022&#xff0c;打工人已默默扛起来年的OKR 。根据市场研究机构Garner预测&#xff0c;2023将迎来科技爆发之年&#xff0c;最值得关注的云计算趋势是AI和ML、多云和混合云解决方案、物联网、云安全等。 及时了解不断变化的技术格局…

汇聚数据库创新力量 GBASE携手openGauss助企业数字化转型

12月29日&#xff0c;openGauss Summit 2022于线上举行。本次大会是由openGauss开源数据库社区联合行业组织、伙伴及客户共同举办的一场年度数据库产业界交流与分享峰会。天津南大通用数据技术股份有限公司&#xff08;简称&#xff1a;GBASE&#xff09;首次以openGauss社区理…