makeMakefile

一、 什么是make&Makefile ?

①make 是一条命令,makefile是一个文件,配合使用,通过依赖关系和依赖方法达到我们形成可执行程序的目的

②makefile好处就是可以进行 自动化编译 ,极大的提高软件开发的效率,一旦写好,只需要一个 make 命令,整个工程即可以完全自动编译
③make 是一个命令工具,是一个解释 makefile 中指令的命令工具

二、  实例代码

0x01 Makefile的编辑

[wh@localhost lesson7]$ touch test.c
[wh@localhost lesson7]$ touch Makefile //Makefile建议开头大写
[wh@localhost lesson7]$ vim test.c
[wh@localhost lesson7]$ vim Makefile
[wh@localhost lesson7]$ make
gcc test.c -o test -std=c99
[wh@localhost lesson7]$ ll
total 20
-rw-rw-r--. 1 wh wh   41 Oct  5 05:54 Makefile
-rwxrwxr-x. 1 wh wh 8512 Oct  5 05:54 test
-rw-rw-r--. 1 wh wh   73 Oct  5 05:54 test.c
[wh@localhost lesson7]$ ./test
hello world
[wh@localhost lesson7]$ cat Makefile
test:test.c    //test的形成依赖于test.c,也可以说目标文件依赖于依赖文件gcc test.c -o test -std=c99  //依赖方法

上述代码是对一个项目的形成,当然我们也要对其进行清理:

[wh@localhost lesson7]$ cat Makefile
test:test.cgcc test.c -o test -std=c99.PHONY:clean
clean:rm -f test

.PHONY是对clean的一个修饰,可以说clean是一个伪目标,而clean只有依赖方法,没有依赖关系,并且目标可执行程序如果没有修改,不需要重复执行,而伪目标可以多次执行

0x02 上述代码中为什么只输入make就形成了可执行程序test,而必须输入make clean才能进行清理呢?

 make扫描makefile文件的时候,默认只会形成一个目标依赖关系,一般就是第一个

当然也可以用$@代替目标文件,$^代替源文件

  1 test:test.c2   //gcc test.c -o test -std=c99  3   gcc -o $@ $^   4 .PHONY:clean5 clean:6     rm -f test

上述的test:test.c依赖关系也可以细分为:

  1 test:test.o2   gcc  test.o -o test                                                                                        3 test.o:test.s4   gcc -c test.s -o test.o5 test.s:test.i6   gcc -S test.i -o test.s7 test.i:test.c8   gcc -E test.c -o test.i9 .PHONY:clean10 clean:11     rm -f test test.i test.s test.o

0x03 printf在sleep之前,为什么先进行6s之后,printf才输出呢?难道是sleep先于printf运行吗?

当然不是,是因为printf已经执行,但是数据没有被立即刷新到显示器当中
①没有\n,字符串会暂时保存起来,保存在用户C语言级别的缓冲区中
②显示器设备刷新策略就是行刷新,遇到\n即进行刷新
③如果想要立马刷新,则可以使用fflush(stdout);因为printf打印向stdout打印,则刷新即是向stdout刷新

C程序,默认会打开三个流:

stdin对应键盘,stdout对应显示器,stderr对应显示器
因为程序的运行需要数据的输入,结果的输出以及错误的输出

三、Linux 第一个小程序 --进度条

0x01 初步学习

  1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6   int count = 10;                                                                                            7   while(count)8   {9     printf("%d\r",count);10     fflush(stdout);11     count--;12     sleep(1);13   }14   return 0;15 }

① 此时,显示器中显示的是10,90,80,70,...,10,这是为什么呢?
凡是从键盘读取的内容都是字符和显示到显示器上面的内容都是字符,比如pirntf("%d\n",234);每次显示的是字符2,字符3,字符4,每次%r,都是只重置到首字母,但是不换行,fflush刷新的都是一个字符
②那如何解决这个问题呢?
可以预留一部分空间出来,printf("%2d\r");留出来俩个空间

0x02 进一步编写

  1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4                                                                                                              5 int main()6 {7 #define NUM 1008   char bar[NUM+1];//预留出'\0'的位置9   memset(bar,'\0',sizeof(bar));10 11   int i = 0;12   while(i <= 100)13   {14     printf("%s\r",bar);15     fflush(stdout);16     bar[i] = '#';17     i++;18     sleep(1);19   }20 }

0x03 增加[ ]和百分比和运行光标

  1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 5 int main()6 {7 #define NUM 1008   char bar[NUM+1];9   memset(bar,'\0',sizeof(bar));10   const char* label = '|/-\\'11   int i = 0;12   while(i <= 100)13   {14     printf("[%-100s][%d%%] %c\r",bar,i,label[i%4]);//预留100个空间,%是转义字符,%%表示一个%//因为默认格式控制是右对齐,所以是从右往左打印,加'-'则是左对齐,从左往右打印15     fflush(stdout);16     bar[i] = '#';17     i++;18     usleep(50000);19   }20   printf("\n");                                                                                              21 }

0x04 运行成果

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

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

相关文章

MySQL 事务隔离级别与锁机制详解

目录 一、前言二、事务及其ACID属性三、并发事务处理带来的问题四、事务隔离级别4.1、隔离级别分类4.2、查看当前数据库的事务隔离级别:4.3、临时修改数据库隔离级别&#xff08;重启MySQL后恢复到配置中的级别&#xff09; 五、表数据准备六、MySQL常见锁介绍5.1、锁分类5.2、…

【Pytorch笔记】6.Transforms

pytorch官方文档 - transforms transforms需要使用计算机视觉工具包&#xff1a;torchvision。 torchvision.transforms&#xff1a;常用的图像预处理方法&#xff1b; torchvision.datasets&#xff1a;常用数据集的dataset实现&#xff0c;如MNIST、CIFAR-10、ImageNet等&am…

【RK3588】YOLO V5在瑞芯微板子上部署问题记录汇总

YOLO V5训练模型部署到瑞芯微的板子上面&#xff0c;官方是有给出案例和转过详情的。并且也提供了Python版本的推理代码&#xff0c;以及C语言的代码。 但是&#xff0c;对于转换过程中的细节&#xff0c;哪些需要改&#xff1f;怎么改&#xff1f;如何改&#xff0c;和为什么…

1392. 最长快乐前缀

链接&#xff1a; 1392. 最长快乐前缀 题解&#xff1a; class Solution { public:string longestPrefix(string s) {if (s.size() < 0) {return "";}int MOD 1e9 7;// 构建26的n次方&#xff0c;预处理std::vector<long> pow26(s.size());pow26[0] 1…

vue3中使用return语句返回this.$emit(),在同一行不执行,换行后才执行,好奇怪!

今天练习TodoList任务列表案例,该案例效果如图所示&#xff1a; 此案例除了根组件App.vue&#xff0c;还有TodoList、TodoInput、TodoButton三个子组件。 因为有视频讲解&#xff0c;在制作TodoList、TodoInput时很顺利&#xff0c;只是在完成TodoButton这个组件时出了点问题…

《protobuf》基础语法3

文章目录 默认值更新规则保留字段未知字段 默认值 在反序列化时&#xff0c;若被反序列化的二进制序列中不包含某个字段&#xff0c;则在反序列化时&#xff0c;就会设置对应默认值。不同的类型默认值不同&#xff1a; 类型默认值字符串“”布尔型false数值类型0枚举型0设置了…

微信开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 时间过得真快&#xff0c;转眼就到了国庆节尾巴&#xff0c;小伙伴们吃好喝好玩好了么。 关于微信开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送&#xff0c;事件类型以In…

ssm+vue的培训机构运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的培训机构运营管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…

蓝桥杯每日一题2023.10.6

题目描述 门牌制作 - 蓝桥云课 (lanqiao.cn) 题目分析 #include<bits/stdc.h> using namespace std; int ans; int main() {for(int i 1; i < 2020; i ){int x i;while(x){int a x % 10;if(a 2)ans ;x / 10;}}cout << ans;return 0; } 题目描述 既约分数…

C++设计模式-桥接(Bridge)

目录 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 二、适用性 你不希望在抽象和它…

Spring Cloud Gateway网关中各个过滤器的作用与介绍

文章目录 1. Route To Request URL Filter&#xff08;路由过滤器&#xff09;2. Gateway Filter&#xff08;全局过滤器&#xff09;3. Pre Filter&#xff08;前置过滤器&#xff09;4. Post Filter&#xff08;后置过滤器&#xff09;5. Error Filter&#xff08;错误过滤器…

Linux中的wc命令

2023年10月6月&#xff0c;周五晚上 目录 wc命令的主要功能和用法如下:统计文件行数、字数和字节数只统计行数只统计字数只统计字节数 wc命令在Linux/Unix系统中是word count的缩写,它用来统计文件的行数、字数和字节数。 wc命令的主要功能和用法如下: 统计文件行数、字数和字…

【C++设计模式之状态模式:行为型】分析及示例

简介 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;看起来就像是改变了其类。状态模式将对象的状态封装成不同的类&#xff0c;并使得对象在不同状态下有不同的行为。 描述 状态模式通过…

Qt之显示PDF文件

之前使用过mupdf库&#xff0c;能够成功显示pdf&#xff0c;但是我用着有BUG&#xff0c;不太理解它的代码&#xff0c;搞了好久都不行。后面又试了其他库&#xff0c;如pdfium、popler、下载了很多例程&#xff0c;都跑不起来&#xff01;后面偶然得知xpdf库&#xff0c;看起来…

C++-封装unordered

本期我们来封装实现unordered系列&#xff0c;需要前置知识&#xff0c;没有看过哈希的建议先看看哈希&#xff0c;而且哈希的代码都在这里面&#xff0c;一会要用到 C-哈希Hash-CSDN博客 目录 代码实现 迭代器 const迭代器 全部代码 代码实现 首先我们要把V改为T&#xff…

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…

STM32复习笔记(一):软件配置工程创建

目录 Preface&#xff1a; Hardware-Configuration & Software-Environment&#xff1a; &#xff08;一&#xff09;新建项目工程 &#xff08;二&#xff09;工程配置 &#xff08;三&#xff09;配置外设 &#xff08;四&#xff09;项目管理 &#xff08;五&…

区别对比表:阿里云轻量服务器和云服务器ECS对照表

阿里云轻量应用服务器和云服务器ECS区别对照表&#xff0c;一看就懂的适用人群、使用场景、优缺点、使用限制、计费方式、网路和镜像系统全方位对比&#xff0c;阿里云服务器网分享ECS和轻量应用服务器区别对照表&#xff1a; 目录 轻量应用服务器和云服务器ECS区别对照表 轻…

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…