Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自动化构建与进度显示:全面解读 make 与 Makefile

自动化构建与进度显示:全面解读 make 与 Makefile

作者头像
HZzzzzLu
发布于 2024-12-26 01:10:02
发布于 2024-12-26 01:10:02
27710
代码可运行
举报
文章被收录于专栏:codingcoding
运行总次数:0
代码可运行
makemakefileLinux/Unix 开发环境中用于自动化构建的强大工具,尤其在多文件编译的项目中,用于管理文件之间的依赖关系和构建规则。通过定义编译规则,Make工具可以根据源文件的更新情况,自动决定哪些部分需要重新编译,从而提高开发效率。

Make

make 是一个自动化构建工具,通过解析 makefile 文件中的规则,管理项目的构建流程。它的主要功能是根据源文件的修改情况,自动更新目标文件,避免手动输入复杂的编译命令。

make 的主要功能

  1. 自动化构建:通过规则定义编译、链接等步骤,减少重复操作。
  2. 增量编译:仅编译发生变化的文件,优化构建时间。
  3. 灵活性:支持复杂的依赖关系和自定义任务。

使用 make 工具

执行 make 命令时,make 会自动查找当前目录下的 Makefilemakefile 文件,并根据文件中的规则执行第一条命令(其余的需要显示调用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
make

Makefile 的基本结构

Makefile 是定义构建规则的文件,其核心部分是规则描述。每一条规则的基本格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Target : Dependencies
	Command
  • 目标(Target):需要生成的文件或任务。
  • 依赖项(Dependencies):生成目标所需的文件或条件。
  • 命令(Command):实现目标的具体操作,需以Tab键开头。

简单示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
code:code.c
	gcc code.c -o code

.PHONY:clean
clean:
	rm -f code

具体说明:

  • code 是需要生成的可执行文件,其生成需要依赖 code.c 文件,通过 gcc code.c -o code 生成。
  • clean 的作用是清理生成的 code 文件,但是没有直接跟 code 关联,需要显示调用 make clean 来清除 code 以便重新编译。
  • .PHONY 修饰 cleanclean 就会成为伪目标,伪目标是指不对应具体文件的目标,常用于定义清理任务或其他辅助操作,其特性就是总是能够被执行,原因在于 .PHONYmake 忽略源文件和可执行文件的 Modify 时间

补充:

文件的相关时间有3个,可以通过 start 来查看。

  • 访问时间 (Access Time):表示文件内容最近一次被访问的时间。
  • 修改时间 (Modification Time):表示文件内容最近一次被修改的时间。
  • 状态更改时间 (Change Time):表示文件属性最近一次发生更改的时间。

补充:

执行 make 时,code 被编译成 code.c ,之后当文件内容没有发生更改时,是无法再次 make 的,这是通过比较 code.ccode 的修改时间 (Modification Time) 来做到的,当 code.c 的修改时间早于 code 的修改时间时就无法再次 make

.PHONY 的作用就是让 make 忽略源文件和可执行文件的 Modify 时间,哪怕文件没有修改就可以执行 make

进阶示例

makefile 支持变量的定义,便于规则复用和代码维护。变量的值可以在定义时赋值,也可以在命令行传入;也提供了一些自动变量,用于简化规则中的目标和依赖项引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 定义变量
CC = gcc
TARGET = main
OBJS = main.o utils.o

# 默认目标
$(TARGET): $(OBJS)
	$(CC) -o $@ $^

# 自动生成目标文件
%.o: %.c
	$(CC) -c $< -o $@ 

# 清理目标
.PHONY: clean
clean:
	rm -f $(OBJS) $(TARGET)
  • \$(CC) :变量CC的值,其他变量同理。
  • $@ :当前规则的目标文件名。
  • $< :当前规则的第一个依赖项。
  • $^ :当前规则的所有依赖项。
  • %.o: %.c :所有的.o文件都可以通过对应的.c文件生成

MakeMakefile 的优缺点

优点

  1. 自动化构建:减少手动输入编译命令的重复劳动。
  2. 高效增量编译:仅重新编译必要的文件。
  3. 灵活性高:支持多种任务自动化,如清理、打包、测试等。
  4. 易扩展:通过变量和规则,支持复杂项目管理。

缺点

  1. 语法简洁但不直观:规则书写需要严格遵守语法格式(如Tab开头)。
  2. 大型项目维护难度较大:需要搭配其他工具(如CMake )简化管理。

倒计时与进度条程序

倒计时

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <unistd.h>

int main()
{
    int i = 10;		// 初始化计数器 i 为 10
    while(i >= 0)	// 当 i 大于等于 0 时,进入循环
    {
        printf("%-2d\r", i);     // 使用 %-2d 格式化输出 i,左对齐,保证占用 2 个字符的宽度,并且在输出后添加回车符 \r
        fflush(stdout);         // 刷新输出缓冲区,强制将数据立即输出到屏幕上
        i--;	// i 每次递减 1
        sleep(1);	// 程序暂停 1 秒
    }
    return 0;
}

代码解析:

  1. %-2d:在 printf 中,%-2d 是用来打印整数的格式化字符串。%-2d 表示将数字左对齐并且占用至少 2 个字符的宽度。假设 i 是个位数时,输出会带有一个空格,如 1、 2 等。这样保证打印数字时,光标位置不会被打乱。、
  2. \r:回车符 \r 的作用是将光标移动到当前行的最前面。因此,每次打印一个新的数字后,光标会回到行首,覆盖之前打印的数字,达到每次更新显示数字的效果。
  3. fflush(stdout)printf 输出通常是缓冲输出,也就是说数据会先保存在缓冲区中,直到缓冲区满或者程序结束时才会输出。为了确保每次打印的数字能够立即显示在屏幕上,使用 fflush(stdout) 强制刷新缓冲区。
  4. sleep(1)sleep(1) 使得程序每次打印数字后会暂停 1 秒,形成倒计时的效果。

进度条

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define NUM 101
#define STYLE '#'
double total = 1024.0;      //总下载量(1024 MB)
double speed = 1.0;         //下载速度 (每次增加 1MB)

void process_v2(double cur)
{
    char buffer[NUM];	// 用于存储进度条的字符数组
    memset(buffer, 0, sizeof(buffer));	// 初始化数组,将所有元素置为 0
    const char* lable = "|/-\\";	// 动态指示器(显示的符号)
    int len = strlen(lable);	// `lable` 字符串的长度(4)

    static int cnt = 0;		// 静态变量,记录动态符号的位置
    cnt %= len;		// 每次更新时,cnt 取值为 0~3,用来循环显示 `|/-\`
    int num = (int)cur * 100 / total;	// 当前下载进度的百分比
    int i = 0;		// 根据当前进度填充进度条
    for(;i < num;++i)
        buffer[i] = STYLE;
    double rate = cur / total;	// 计算当前进度的比例
    printf("[%-100s][%.1lf%%][%c]\r", buffer, rate * 100, lable[cnt]);	// 输出进度条、百分比和动态符号
    fflush(stdout);		// 刷新输出缓冲区,确保立即显示
    cnt++;	// 更新动态符号的索引
}

void DownLoad()
{
    double cur = 0;         // 当前下载量初始化为 0
    while(cur <= total)		// 当下载量小于等于总下载量时,持续更新进度条
    {
        process_v2(cur);	// 调用 process_v2 更新进度条
        usleep(5000);	// 暂停 5 毫秒,模拟下载过程
        cur += speed;	 // 每次增加 1MB
    }
    printf("\ndownload %.2lfMB Done\n", cur);	// 下载完成后输出提示信息
}

int main()
{ 
    DownLoad();		// 启动下载过程
    return 0;
}

代码解析:

  1. 常量和变量定义
    • NUM 是定义的进度条长度(101 个字符)。
    • STYLE 是进度条中用来表示已下载部分的符号(#)。
    • total 表示总下载量(1024 MB)。
    • speed 定义了每次增加的下载量(1 MB),表示每次下载的增量。
  2. process_v2 函数
    • 进度条缓冲区:buffer 数组用于存储进度条的显示状态,长度为 NUM(101)。
    • 动态符号:lable 字符串包含 4 个字符 |, /,-, \,通过变量 cnt 控制这些字符的循环显示,给人一种“加载中”的感觉。
    • 下载进度计算:num = (int)(cur * 100 / total) 计算当前下载量 cur 相对于总下载量 total 的百分比,然后用这个百分比来填充进度条。
    • 输出格式:通过 printf 输出格式化的进度条,%-100s 表示左对齐且占据 100 个字符的空间,%.1lf%% 显示进度百分比,[%c] 显示动态字符。
    • 刷新输出:fflush(stdout) 确保每次进度条输出后立即刷新,避免缓冲区延迟输出。
  3. DownLoad 函数
    • 下载过程:cur 是当前已下载的量,初始值为 0。while(cur <= total) 循环执行,直到下载量达到总量 total
    • 进度更新:每次循环调用 process_v2(cur) 更新进度条,并暂停 5 毫秒(usleep(5000)),然后增加下载量。
    • 下载完成:当 cur 超过 total 后,跳出循环并打印下载完成信息。

该程序会动态显示一个进度条,模拟下载进程。屏幕输出会类似如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[##########################################----------------------------------------][50.0%][|]
[####################################################------------------------------][70.0%][-]
[###############################################################------------------][90.0%[\]
[##################################################################################][100.0%]\]
download 1024.00MB Done

Have a good day😏

See you next time, guys!😁✨🎞

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
总是在追随科技
总是在追随科技
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Google Fonts导致WordPress 速度问题的三个解决方案
本来实在是不想写这个的,因为相关方法在圈子里面已经烂大街了。但无奈,一些客户将近期的Google Fonts导致 WordPress 打开速度慢的现象归咎于我的主题——真TM 比窦娥还冤。所以,有必要在这里说下。 2015.2.26更新:Google Fonts 已可正常访问,相关插件可卸,本文已失效 Google Fonts导致WordPress 速度问题之原因 WordPress 自3.8+版本后加入了Google Fonts(别问我Google Fonts是什么了),然后捏,因为近期敏感周期(35号)
Jeff
2018/01/19
2.3K0
加快WordPress后台访问速度&优化网站性能
前段时间访问网站后台速度慢的离奇,甚至还会出现登录失败的情况,这几天总算折腾的差不多了 总结下来造成卡慢的原因主要有以下几个
LonelyEnderman
2022/10/27
1.9K0
加快WordPress后台访问速度&优化网站性能
提高WordPress网站的打开速度
就是把调用的谷歌的文件链接换成国内的链接。在你的后台主题编辑中,在所有的文件中Ctrl+F搜索关键字“google”,如果搜到相关谷歌的链接诸如fonts.googleapis.com大家可以把这个文件(可能下载需要翻墙具体我没试过)下载下来放到自己网站里完了更换成自己网站的文件链接就可以。
Inkedus
2020/04/16
2.1K0
别让Open Sans字体拖慢wordpress后台速度
  最近打开wordpress后台是不是很慢?国内GG登不上了?这两者有没什么直接的联系?没错,WordPress后台是自动加载的谷歌Open Sans字体,据说gg服务器已经迁移到阿嘛丽可,需要一些小手段才能访问。既然如此,那就把Open Sans字体屏蔽了吧。   将如下代码复制到主题文件function.php //禁用Open Sans字体   function remove_open_sans() {   wp_deregister_style( 'open-sans' );   wp_re
ytkah
2018/03/05
6920
别让Open Sans字体拖慢wordpress后台速度
分享纯代码禁用WordPress谷歌字体
WordPress加载谷歌字体会拖慢国内程序的运营速度,今天全百科网就给大家分享下如何利用代码禁止谷歌字体的调用方法。
于飞云计算
2019/06/24
1.3K0
分享纯代码禁用WordPress谷歌字体
解决新版wordpress打开速度超级慢的问题
突然发现更新到wordpress3.9以后,网站的打开速度变得超慢。开始还以为是自己服务器的原因,把网站从美国搬家到中国香港,还是一样慢。然后仔细排查了一下原因,发现是由于 Google服务器无法访问造成的,因为新版wordpress系统中会加载谷歌Opensans字体样式,导致网站非常的慢,需要等待很久。本人新手,有问题喜欢到网上“拿来”。下面是在网上找到的办法,本人懒,采用的第二种方法,问题已经解决。 第一、取消谷歌Open sans字体加载(wp更新不受影响) 1、添加代码法 通过禁用谷
用户2135432
2018/06/04
5.8K1
WordPress 首页加载速度(根本停不下来!)
一直就发现首页加载的速度非常蛋疼,直接蛋疼的都要碎了。今天仔细的研究了一下,发现出错的地方都是由于Google服务被屏蔽导致的,感谢CCAV。其实一个出错的是Google的自定有搜索框,第二个是Google的开放字体服务;对于第一个确实没什么好的办法,只能暂时去掉了,如果要搜索指定站点的内容可以使用site修饰符例如在Google搜索框中输入site:www.h4ck.org.cn 关键词 然后搜索即可。至于第二个问题,解决的办法比较简单,出错的是wp-includes/script-loader.php,第602行的内容:
obaby
2023/02/23
4800
WordPress 开发之使用WordPress 3.8+后台图标(dashicons)
伴随着WordPress 3.8 的新界面,WordPress 官方为后台UI 引进了目前贼流行的webfont(又称 icon font),官方独立项目名为dashicons。webfont 本质上是图标——通过字体文件作为载体的矢量图,好处就是,可以比较方便自由修改大小、颜色等字体样式且不像图片那样放大会失真——所以说乔布斯炒起来的retina 屏幕不在话下了。那么,如果你是WordPress 开发者,你可以通过以下方式在你开发的主题或插件中使用WordPress 3.8+后台图标(dashicons)
Jeff
2018/01/19
1.4K0
WordPress 开发之使用WordPress 3.8+后台图标(dashicons)
wordpress解决谷歌字体问题–与谷歌字体的战争!
这个问题算是困扰很久了,以往是用插件,勉强好一点,但是,随着版本更新,谷歌问题又一次出现,so,这次修改源代码,使用360提供打代理站点来解决谷歌字体的问题。其次还用了修改源代码的方式。
十四君
2019/11/28
1.5K0
【WordPress优化一】挑选一个好的主题
WordPress的强大体现在了您如何利用WordPress去创造您自己的网站,可能回答这个问题,多数人会说,用主题、用插件来解决。
夏末浅笑
2019/01/10
7620
重置多说配置后的问题,这是不让我从良的节奏啊(附禁用谷歌在线字体的方法)!
本想今天发文从良,金盆洗手,从此不再折腾博客,安心写文章的。结果,发现多说又不能同步服务器评论到本地了!特么真是怕什么来什么啊!想来这金盆暂时用不着了。。。 想到昨天手贱重置了多说配置,看来元凶已出: 前两天发现,多说弹出的评论通知,里面的超链接总是带了 www,也就是说,我的博客本身是不带 www 的,但是多说提示框里面却是 http://www.zhangge.net/***,真是个坑! 于是,先停用了其他插件,并重置了多说配置(手贱啊),发现通知已恢复正常!现在反省一下,感觉根本不用重置多说配置,导致
张戈
2018/03/23
1.1K0
自定义(修改)WordPress管理后台界面的字体样式
默认的话,WordPress 后台管理界面的字体样式是“sans-serif”,中文的话直接是宋体了(当然,在Windows的机子上是这样,苹果机可能不同)。不知道是看多了的缘故,总觉得宋体太难看了,想换成微软雅黑。但是苦于WordPress 特殊的文件机制,实现起来并不是加个CSS 样式那么简单(没耐心得直接看折腾三)。 折腾一(fail) Jeff 在本地测试,通过开发者工具查看WordPress 后台样式文件,结果让我蒙了:比如说,某部分的CSS 竟然是通过PHP 文件来加载CSS 的(讲得不明不白,
Jeff
2018/01/19
2.6K0
自定义(修改)WordPress管理后台界面的字体样式
WordPress访问优化
由于本站服务器是租用的海外vps,国内访问速度极其真实,再加上近来自己又添加了许多花里胡哨的插件,导致第一次访问网站的时候需要加载的内容极其臃肿,使用ctrl+F5强制刷新后测试主页面完全加载需要长达14000ms。
Diuut
2022/11/22
7580
WordPress访问优化
关于WordPress中字体加载慢的问题解决方案
最近发现Wordpress有时候加载的特别慢,于是就想办法找了下原因。之前听网上说是因为wordpress用的是Google的字体库,而且是每次都要加载,导致访问慢的,于是当时装了个Disable Google Fonts的插件,禁用了Google字体,然后装了一个Useso take over Google插件,将字体文件改为360托管的字体库,这样就可以访问快点了。当时的效果的确挺好的,结果最近在使用的时候又发现网站访问慢了,用Chrome查了下资源加载的情况,发现访问useso的字体库的时间特别的长。这时候改用Google字体的时候反而更快了。。。这就十分令人惆怅了,有时候用useso的快,有时候用google的快,真的挺麻烦的。后来想想干脆把这个文件下到服务器上不就好了么。。。于是就倒腾出了下面的办法,将当前主题的字体文件下载到了服务器上。
mythsman
2022/11/14
1.1K0
通过修改function文件来使WordPress网站加载速度更快
说明:WordPress由外国人开发的,使用了很多国外网站服务,比如Gravatar镜像、谷歌字体之类的,由于我们在国内,链接速度自然就慢了很多,有的还时不时的被墙,很影响使用,而且功能很强大,但是很多我们都不需要,这里我们可以通过修改function.php来精简WordPress,从而使网站速度变快。
用户8851537
2021/07/26
7780
【网站优化经验】Wordpress的代码与功能简单优化
现在,我们就要针对wordpress影响网站响应速度的因素进行具体问题具体分析,并探求正确的方法论高效率有效地解决问题。
幻影龙王
2021/09/11
1.2K0
【网站优化经验】Wordpress的代码与功能简单优化
无插件仅代码实现 WordPress 分页导航(2)
最近在折腾 Jeff的阳台 的新主题,在老外的一个主题那里找到了分页导航的一段没有见过的代码,相对应之前的代码而言比较简洁(核心代码仅仅十来行),在这里推荐给大家。顺便多嘴一下:相信过不了多久 Jeff的阳台 就会重新换个皮肤改版上线,唯有新主题上线才能唤起我勤奋更新的动力了! 无插件仅代码实现 WordPress 分页导航教程 一、添加如下代码至主题的funtions.php文件夹内: //分页导航 devework.com function dw_pagination() { global $wp_qu
Jeff
2018/01/19
9390
今天就和朋友们分享下,wordpress网站后台最近打开速度很慢的原因及解决方法。推荐第三种方法
1、安装插件:在插件中搜索 Disable Google Fonts,选择安装,然后启用,这样就可以禁止Google字体的加载,这样就可以提高访问速度了。
超级小可爱
2023/02/20
1.1K0
Google Fonts 已可正常访问,相关插件可卸
大概9 个月前Google Fonts 所在的googleapis.com 被墙,导致WordPress 后台访问慢(详细点这)。最新的情况是,谷歌官方为Google Fonts在国内解析了个国内ip,因此Google Fonts 在国内已可正常访问,相关插件可以卸掉了。 详情 各位可以ping 下fonts.googleapis.com,在国内解析出:googleadapis-china.1.google.com,对应的203.208.48.136是来自北京市海淀区北京谷翔信息技术有限公司的IP地址——即
Jeff
2018/01/19
2.3K0
Google Fonts 已可正常访问,相关插件可卸
vim替换wordpress中所有谷歌字体链接
因为wordpress网站的主题在加载中会花费很多时间在寻找谷歌字体上,我也试过各种插件均无效,这个问题纠结很久了,今天终于忍无可忍用vim的全局文件替换的两个命令搞定之.特地记录下来,
十四君
2019/11/29
9490
vim替换wordpress中所有谷歌字体链接
推荐阅读
相关推荐
Google Fonts导致WordPress 速度问题的三个解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验