【Linux】快速上手自动化构建工具make/makefile

news2025/1/11 23:54:36

👀樊梓慕:个人主页

 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》《Linux》

🌝每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.什么是make / makefile

2.如何使用make / makefile

(1)我们来看makefile如何写?

(2)如何与make搭配使用?

3.make和makefile是如何知道可执行程序是比较新的?


前言

本篇文章可以快速让你具备编写makefile的能力,并快速上手使用。


欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码:🌟fanfei_c的仓库🌟

=========================================================================


1.什么是make / makefile

make是一条命令,makefile是一个文件,两者搭配使用就可以完成项目自动化构建(类似VS编译器(集成开发环境)的自动化编译)。

make会在当前目录下寻找名字叫"Makefile"或"makefile"的文件,并根据文件内容执行相关指令。

注:文件名必须为上面其一。


2.如何使用make / makefile

(1)我们来看makefile如何写?

首先我们用vim写一段代码,命名为mytest.c。

平时我们想要编译该.c文件如何做呢?

gcc -o mybin mytest.c

 但我们知道平时所用的比如VS编译器可不仅仅干了这一个工作,还有比如工程清理(即清理解决方案,清理目标文件的意思)等工作。

这时候就需要makefile出手了,这也是为什么叫自动化构建的原因。

在makefile中我们要按照如下格式书写语句:

mybin:mytest.c                     //依赖关系
        gcc -o mybin mytest.c  //依赖方法

mybin为目标文件,mytest.c为依赖文件,当然不一定只有这一个依赖文件。 

注:第二行缩进不可去。

我们把刚才提到的工程清理加上:

另外我们还可以利用$@代表目标文件(mybin),$^代表所有依赖文件(mytest.c) 

到这里还不够,我们要再讲一下如果mytest.c没有改变,那么make执行会重新编译生成新的目标文件mybin么?

答案是不会:如果目标文件所依赖的后面的依赖文件列表中有文件修改时间比目标文件新,那么make就会执行后面所定义的命令生成新的目标文件,否则不会。

那clean呢?

如果我们直接输入make,由于clean没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,所以我们需要使用make clean指令。

但还有另一个问题:

如果当前目录没有clean的同名文件,那还好,不影响每次make都会执行clean。

但一旦当前目录有一个clean的同名文件,此时clean又没有依赖文件,那就麻烦大了,make clean会检测依赖文件列表中的文件有没有clean新,但是clean没有依赖文件,目标文件被认为是最新的,这就导致clean就不会被执行了。

解决方法是将目标文件clean设置为伪目标,用.PHONY修饰。

  • 伪目标的特性是:总会被执行的。

所以最终makefile中我们一般这样写:

(2)如何与make搭配使用?

保存好前面的makefile后,我们直接在命令行输入make。

make后我们再查看当前目录,会发现多出了目标文件mybin。

./mybin 执行该目标文件

 我们看该目标文件成功执行。

那我们再来试一下make clean:

我们发现make clean也可以成功执行。

=========================================================================

看到这,你已经掌握了make/makefile的基本用法

=========================================================================


3.make和makefile是如何知道可执行程序是比较新的?

对比时间,如果可执行程序.exe修改时间比所有.c文件修改时间新,说明他就是最新的。

那么我们来认识下linux下文件时间的概念:

首先利用stat命令查看某个文件的信息。

我们发现了三个时间:

  • Access  ---   访问时间(非实时更新,占用内存)
  • Modify   ---   修改时间(针对内容的修改)
  • Change ---   改变时间(针对属性的修改)

文件是由内容+属性构成。  


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎

🌟~ 点赞收藏+关注 ~🌟

=========================================================================

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

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

相关文章

【Windows】内网穿透实现hMailServer远程发送邮件

目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网…

window环境同时安装python2和python3

背景 在日常环境中,有时候要用到python2写的代码要用Python2执行,有时候python3的代码要用到python3执行.很多人需要同时让Python2和python3的命令都可以用。方便切换环境。 需求 有一些项目需要Python2环境。用的时候就使用 python2 .\1.py 有一些项…

人工智能原理复习--确定性推理

文章目录 上一篇推理概述自然演绎推理合适公式 归结演绎推理归结原理归结反演 提升归结效率下一篇 上一篇 人工智能原理复习–知识表示(二) 推理概述 推理就是按某种策略由已知判断推出另一判断的思维过程 分类: 演绎推理、归纳推理、默…

单页应用的架构与设计:打造高效可扩展的 Web 应用(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

『运行心得』机柜断电事件的排除与解决

本文描述了一起机房机柜断电事件引发的故障排除和解决过程。 当办公楼机房发生断电后,经过排查发现可能是空气开关短路导致。尽管重新合上空气开关后设备恢复正常,但断电事件再次发生,电工怀疑空气开关老化导致电路故障,并将电源…

python 实现链表

链表基础知识 链表是在物理内存中不连续,数据通过链表中的指针来链接到下一个元素。 链表由一系列节点组成,节点在运行时动态生成,节点一般包括两个部分:存储数据的数据域,存储下一个节点的指针域 链表的常用操作&a…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

基于pyltp的依存句法分析

代码是两年多前网上找的,能运行。先记在这里,以防以后用到 import os from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller # pip install pyltp -i https://pypi.tuna.tsinghua.edu.cn/simple 可以先下载好…

Shopee买家通系统,智能下单新体验

Shopee买家通系统带来了一场智能下单的革命,为用户提供了更便捷的购物体验。通过简单的准备工作,您即可使用该系统完成自动下单,省去繁琐步骤,轻松实现购物愉悦。 账号准备,注册无忧 首先,准备一个具备下单…

C++的编译链接

文章目录 1、前置条件2、预处理/预编译2、编译3、汇编5、链接 1、前置条件 # 操作系统版本 cat /proc/version Linux version 3.10.0-1160.95.1.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Jul 24 …

iOS 开发高效率工具包:10 大必备工具

​ 作为 iOS 开发人员,拥有合适的工具可以极大地提高您的工作效率和工作质量。无论您是刚刚起步还是已经开发 iOS 应用程序多年,以下是每个 iOS 开发人员都应该了解的 10 大必备工具。 让我们开始 Xcode Xcode 是用于 iOS 开发的官方 IDE(…

JavaScript中的for循环你用对了吗?

​🌈个人主页:前端青山 🔥系列专栏:JavaScript篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-for循环 目录 循环结构 循环思想(三要素) 实现…

ElasticSearch知识体系详解

1.介绍 ElasticSearch是基于Lucene的开源搜索及分析引擎,使用Java语言开发的搜索引擎库类,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。 它可以被下面这样准确的形容: 一个分布式的实时文档存储&#xf…

CSS特效023:文字聚光灯效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

LoadRunner性能测试从零开始

目录 第1章 软件性能测试 1.1 什么是软件的性能 1.1.1 软件 1.1.2 软件性能的产生 1.1.3 功能与性能的关系 1.1.4 用户眼里的软件性能 1.1.5 软件人员眼里的软件性能 1.1.6 以空间换时间 1.1.7.以时间换空间 1.2 软件性能测试 1.2.1 性能测试在软…

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测

EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测 目录 EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【EI级】Matlab实现TCN-LSTM-Multihead-Attent…

解决错误代号0x80240438丢失的全面指南,分析0x80240438错误问题

在使用电脑的过程中,我们常常遇到一些复杂的问题,并期待找到最佳解决方案。其中,与“0x80240438”相关的问题是一个值得深入探讨的主题。今天就和大家探讨错误代码0x80240438的问题,都有什么解决办法有效的解决错误代码0x80240438…

Everything结合内网穿透搭建在线资料库并实现随时随地远程访问

Everythingcpolar搭建在线资料库,实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库,实现随时随地访问前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

必须收藏!十五个设计灵感网站

设计师必备的灵感网站是每个设计师都应该关注的一部分。它们是设计师在设计过程中获得灵感和创造力的好地方。 在这里,我将介绍一些值得关注的灵感网站,涵盖不同类型的设计,包括UI设计、平面设计、网站设计等。我希望这些网站能给你带来一些…

【Android】使用intent.putExtra()方法在启动Activity时传递数据

食用方法 在Android中,你可以使用Intent对象来在启动Activity时传递数据。以下是一个示例,展示了如何在startActivity时传递数据到被启动的Activity: 在启动Activity的地方,创建一个Intent对象,并使用putExtra()方法…