Linux工具make与makefile

这篇具有很好参考价值的文章主要介绍了Linux工具make与makefile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

引言

自动化构建工具make/Makefile是一个备受关注的话题。在现代软件开发中,构建和部署过程越来越复杂,需要更加高效和自动化的工具来帮助开发人员管理项目。Make/Makefile就是这样一种工具,它可以通过定义规则和依赖关系来自动化地构建项目。本文将介绍make/Makefile的基本概念和工作原理,并探讨其在现代软件开发中的作用。

1、make && makefile

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

下面我们通过如下示例来进一步体会它们的作用:

①编写makefile文件

touch makefile
vim makefile

使用vim编辑器编辑makefile文件:

Linux工具make与makefile

#makefile文件中的内容
hello.exe:hello.c  
	gcc hello.c -o hello.exe
.PHONY:clean
clean:
	rm -f hello.exe

此时我们只需一个make命令即可完成自动编译:

make

Linux工具make与makefile

make命令的作用,即是执行makefile中的命令,此处执行的命令是:

gcc hello.c -o hello.exe

当我们输入:

make clean

Linux工具make与makefile

此处就执行了:

rm -f hello.exe

2、make执行步骤

当我们在Linux中输入并执行make命令时,make会干些什么呢?

step 1:make会在当前目录下寻找Makefile文件,找到了就会用这个文件作为后续操作的依据;如果没找到Makefile,就会寻找名为makefile的文件;两个都没找到就报错;

step 2:找到Makefile或者makefile之后,默认文件中第一行作为第一个目标;make命令会分析第一个目标的依赖关系,并且执行该目标的依赖方法**;

2.1 依赖关系

hello.exe:hello.c                #依赖关系

makefile文件中hello.exe就是目标(期望生成的内容);我们编译文件hello.c期望生成它对应的可执行文件hello.exe,而你要编译生成这个目标文件,需要依赖hello.c这个文件,这就是依赖关系

2.2 依赖方法

有了依赖关系,我们就知道了生成目标可执行文件hello.exe需要依赖hello.c这个文件,那么我们该怎么利用hello.c文件生成hello.exe文件呢?我们是不是还缺少一个方法,而这个使用目标的依赖关系文件生成期望的目标文件的方法就是依赖方法

gcc hello.c -o hello.exe         #依赖方法

Linux工具make与makefile

需要注意的是,依赖文件列表可以为空

3、项目清理

# makefile文件中的清理部分
.PHONY:clean
clean:
	rm -f code

Linux工具make与makefile

上述makefile文件中,该部分即为项目清理部分;在上述介绍中,我们知道需要显式输入make clean才能实现清除编译好的文件hello.exe以便重新编译:

Linux工具make与makefile

其中.PHONY的使用,是将它设置为伪目标,伪目标的特性是:总是被执行的

4、伪目标 .PHONY

👉 怎样理解总是被执行的?我们试着多次输入make指令,发现结果如下:

Linux工具make与makefile

结果:当第一次使用make命令时,目标被执行生成了一个可执行文件,而当我们再使用make命令时发现make虽然不会报错但是会告诉我们生成的文件的已经是最新的了,目标并没有被执行


那么多次输入make clean指令呢?结果如下:

Linux工具make与makefile

可以一直执行rm -f hello.exe这条指令!(即使已经重复执行了)


我们将生成可执行文件过程更改为伪目标(使用vim编辑器):

# 修改makefile文件
.PHONY:hello.exe
hello.exe:hello.c
	gcc hello.c -o hello.exe

Linux工具make与makefile

再测试一下:

Linux工具make与makefile

👉 One more thingmake是怎么知道生成的目标文件是最新的呢❓ ——文件的三个时间

5、文件的三个时间

我们使用stat指令查看文件时间属性

stat hello.exe

Linux工具make与makefile

其中:

Access :文件最近一次被读取的时间;
Modify :文件内容最近一次被修改的时间;
Change :文件的属性最近一次被修改的时间。

因此,被依赖的文件hello.cModify时间一定比由依赖方法生成的文件hello.exeModify时间更新!那么此时make指令即会由新的hello.c文件生成最新的hello.exe

6、make的工作原理

在上文中我们提到过:“需要显式输入make clean才能实现清除编译好的文件hello.exe”,那么我们需要思考的是,若我们只输入make命令,其执行步骤是什么呢?

make具有依赖性make一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。如果在找了依赖关系之后,冒号后面的文件还是不在,那么就停止工作

hello.exe:hello.o
	gcc hello.o -o hello.exe
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 hell.i
.PHONY:clean
clean:
	rm -f hello.exe hello.i hello.s hello.o     

其寻找依赖关系过程如下:

Linux工具make与makefile

7、Linux下的第一个小程序

认识缓冲区

概念引入:\r\n的区别

\r回车概念:回到当前行的开头。

\n换行概念:换到下一行。

我们一般用'\n'代表回车换行

代码示例:

//一下代码在Linux环境中运行
#include <stdio.h>
#include <unistd.h>

int main()
{
 	printf("hello world!\n"); //行缓冲
    
 	sleep(2);  //让程序休眠指定秒
 	return 0;
}

Linux工具make与makefile

在运行该程序的可执行文件后,"hello world"直接打印于屏幕中,这其实很好理解,因为代码一定是顺序执行的,也就是一定是printf()先执行打印,然后程序再休眠2秒

然而需要注意的是,我们删除'\n'换行符后,代码会出现先休眠2秒,再打印输出

printf一定先跑完,只不过该数据并没有立即显示出来!对应数据就存储在缓冲区中

我们可以使用fflush刷新缓冲区:

fflush(stdout);

stdout的含义是**标准输出流 **,其作用是输出到显示器中:

Linux工具make与makefile

此时加上fflush可以看到先打印再休眠,其原理就是刷新缓冲区至显示屏

进度条

设计小程序,我们还是遵循我们的程序设计结构:函数声明文件、函数实现文件、main文件

①函数声明

该文件包含头文件包含、函数声明、宏定义

//process.h
#pragma once 
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define NUM 101
#define STYLE '#'

void Process();
②函数实现

进度条的实现,需要按格式输出进度条框架、显示进度条百分比、显示进度条加载时的旋转动画;而“进度增长”的过程本质是一个动态变化的字符串,而由于其具有动态变化的特点,因此我们需要在每次输出后刷新缓冲区(更新屏幕上的内容)

#include "process.h"    
    
const char* str[] = {"/","-","\\","|"};  

void Process()
{
    int count = 0;
    char bar[NUM];
    memset(bar, '\0', NUM);
    while (count <= 100)
    {
        printf("[%-100s][%3d%%][%s]\r", bar, count, str[count % 4]); 
        // 刷新缓冲区
        fflush(stdout);
        // 更新字符串
        bar[count] = STYLE;
        count++;
        // 休眠
        usleep(100000);
    }
    printf("\n");
}

Linux工具make与makefile

③main文件
#include "process.h"

int main()
{
	Process();
	return 0;
}
④makefile文件
ProcessOn.exe:main.c process.c
	gcc main.c process.c -o ProcessOn.exe
.PHONY:clean
clean:
	rm -f ProcessOn.exe

以上过程在Linux环境下执行如下:

vim process.h

Linux工具make与makefile

vim process.c

Linux工具make与makefile

vim main.c

Linux工具make与makefile

vim makefile

Linux工具make与makefile

make
./ProcessOn.exe

程序执行如下:

Linux工具make与makefile
成功实现了进度条!文章来源地址https://www.toymoban.com/news/detail-418286.html

到了这里,关于Linux工具make与makefile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:Linux入门到精通 🎉代码仓库:小智的代码仓库 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需

    2024年02月12日
    浏览(63)
  • Linux基础——Linux开发工具(make/makefile,git)

    前言:在经过前面两篇学习,大家对Linux开发工具都有一定的了解,而在此之前最重要的两个工具就是vim,gcc。 如果对这两个工具不太了解,可以先阅读这两篇文章: Linux开发工具 (vim) Linux开发工具 (gcc/g++) 首先让我们来初步了解一下本篇的目标: 1. 学习make/makefile,并能简单

    2024年04月27日
    浏览(37)
  • 【Linux】项目自动化构建工具 - make/Makefile

    会不会写makefile,从侧面说明了一个人是否具备完成大型工程的能力。 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的

    2024年02月04日
    浏览(49)
  • 【Linux】项目自动化构建工具 —— make/Makefile

    前言: 在上一期的博文中,我们对 Linux 下的编译器 - gcc/g++的使用进行了详细的讲解,今天我将给大家讲解的是关于  【Linux】项目自动化构建工具 —— make/Makefile  的详细使用教程!! 本文目录 (一)前情摘要 (二)背景介绍 1、Makefile 的基本认识 2、make 的基本认识 3、

    2023年04月19日
    浏览(61)
  • 【Linux】自动化构建工具make和Makefile

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️社区 : 进步学堂       🛰️专栏 : Linux之路       🛰️欢迎关注:👍点赞🙌收藏✍️留言 在一个工程中的源文件不计数,其按类型、功能、模

    2023年04月18日
    浏览(47)
  • 【Linux】项目自动化构建工具-make/Makefile

    会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂

    2023年04月09日
    浏览(46)
  • Linux---(六)自动化构建工具 make/Makefile

    make是一个命令。 Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。 🎗️会不会写Makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。 🎗️一个工程中的源文件数不胜数,其按照类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则

    2024年02月05日
    浏览(44)
  • 【Linux】自动化构建工具-make/Makefile详解

     前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门!  订阅专栏阅读:YY的《Linux》系列 ❀❀❀❀❀ 【Linux系列-P1】 Linux环境的搭建 【Linux系列-P2】Linux的基本知

    2024年02月16日
    浏览(38)
  • [Linux 基础] make、Makefile自动化构建工具

    make是一个命令,Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。 在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建

    2024年02月06日
    浏览(40)
  • 【Linux】项目自动化构建工具make/makefile

    🏖️作者:@malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 本篇文章我们将要讲解的是项目自动化构建工具make与makefile。 一、make/makefile的背景 会不会写makefile,从一个侧面说明了一

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包