【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee

news2024/11/18 7:37:06

目录

1. 编译器 gcc

1.1 背景知识

1.2 gcc如何完成

2.1 Makefile背景

2.2 Makefile原理

2.3 Makefile常用符号

3. 模拟倒计时

4. 模拟进度条

5. 使用 git 命令行

5.1 安装 git

5.2 创建项目下载到本地

5.3 推送本地代码到远端仓库


1. 编译器 gcc

1.1 背景知识
  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)
1.2 gcc如何完成

格式:gcc [选项] 要编译的文件 [选项] [目标文件]

一、预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例:gcc –E hello.c –o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

二、编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • 实例:gcc –S hello.i –o hello.s

三、汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  • 实例:gcc –c hello.s –o hello.o

四、连接(生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段。
  • 实例:gcc hello.o –o hello

在这里涉及到一个重要的概念:函数库

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

函数库一般分为静态库和动态库两种。

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。
  • gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

gcc选项

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息。

2. 构建工具 Makefile

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

Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。

Makefile并不会关心命令是如何执行的,仅仅只是会去执行所有定义的命令,和我们平时直接输入命令行是一样的效果。

目标 ... : 依赖 ...
	命令1
	命令2
	. . .

1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。
2、默认情况下Makefile的第一个目标为终极目标。
3、依赖:即目标文件由哪些文件生成。
4、命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求。
5、all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。例如下面的例子:

all: target1 target2 target3
target1:
# 编译规则1
target2:
# 编译规则2
target3:
# 编译规则3
2.3 Makefile常用符号
  1 bin=mytest.exe
  2 src=test.c
  3 
  4 $(bin):$(src)
  5     @gcc -o $@ $^
  6     @echo "compiler $(src) to $(bin)"                                                                                            
  7 .PHONY:clean
  8 clean:
  9     rm -f $(bin)
  • $   符号表示取变量的值,当变量名多于一个字符时,使用"( )"。$^ 表示所有的依赖文件,$@ 表示生成的目标文件。
  • =   是赋值,下面代码相当于#define的意思。
  • .PHONY   伪目标只是一个标签没有依赖文件,只有用make来调用时才会执行。
  • clean   我们可以编译一条属于自己的clean语句,来清理make命令所产生的所有文件。
  • mytest:test.c   mytest:目标文件。test.c:依赖文件列表,安装空格分隔。

3. 模拟倒计时

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5     int num = 10;
  6     while(num >=0)
  7     {
  8         printf("倒计时:%2d\r",num);                                                                                             
  9         fflush(stdout);       //刷新缓冲区
 10         num--;
 11         sleep(1);
 12     }
 13     printf("\n");
 14     return 0;
 15 }
[root@localhost ~]# make
compiler test.c to mytest.exe
[root@localhost ~]# ls
111  aaa.c  anaconda-ks.cfg  a.out  Makefile  mytest.exe  test.c
[root@localhost ~]# ./mytest.exe 
^C计时: 7
[root@localhost ~]# 

4. 模拟进度条

现在我们模拟实现一个进度条:
一共包含4个文件:

Process.h

Process.c

Main.c

Makefile

Process.h文件

  1 #pragma once
  2 
  3 #include<stdio.h>
  4 
  5 void ProcBar();   

Process.c文件

  1
  2 #include"Process.h"
  3 #include<string.h>
  4 
  5 #define Length 101
  6 #define Style '#'
  7 const char* lable = "|/-\\";
  8 
  9 //version 1
 10 void ProcBar()
 11 {
 12     char bar[Length];
 13     memset(bar,'\0',sizeof(bar));
 14 
 15     int num = 0;
 16     int len = strlen(lable);
 17     while(num <= 100)
 18     {
 19         printf("[%-100s][%d%%][%c]\r",bar,num,lable[num%len]);
 20         fflush(stdout);
 21         bar[num++] = Style;
 22         usleep(10000);
 23     }
 24     printf("\n");
 25 }  

Main.c文件

  1 #include"Process.h"
  2 
  3 int main()
  4 {
  5     ProcBar();                                                                                                                   
  6     return 0;
  7 }

 Makefile文件

  1 
  2 process.exe:Main.c Process.c
  3     gcc -o $@ $^
  4 .PHONY:clean
  5 clean:
  6     rm -f process.exe  

5. 使用 git 命令行

5.1 安装 git
yum install git -y
5.2 创建项目下载到本地

1、创建账号这个比较简单, 参考着官网提示即可. 需要进行邮箱校验。

2、登陆成功后, 进入个人主页,按钮新建项目。

3、终端输入要复制的代码

git clone https://gitee.com/xiaoxiaoniba/test1.git
5.3 推送本地代码到远端仓库

1、将代码放到刚才下载好的目录中,将需要用 git 文件:添加到本地仓库

[root@localhost test1]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	Process.c
nothing added to commit but untracked files present (use "git add" to track)
[root@localhost test1]# ls
LICENSE  Process.c  README.en.md  README.md
[root@localhost test1]# git add .
[root@localhost test1]# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	new file:   Process.c
#
[root@localhost test1]# 

2、 git commit 提交改动到本地

注意:提交的时候应该注明提交日志, 描述改动的详细内容。

[root@localhost test1]# git commit -m "this is my fist commit"
[master 53d9b01] this is my fist commit
 1 file changed, 25 insertions(+)
 create mode 100644 Process.c
[root@localhost test1]# 

3、 git push 同步到远端服务器上

需要填入用户名密码, 同步成功后, 刷新 Github 页面就能看到代码改动了

root@localhost test1]# git push
//...
Username for 'https://gitee.com': 1
Password for 'https://xxxxxxxx
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 540 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/xiaoxiaoniba/test1.git
   600878a..53d9b01  master -> master


本章完。 

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

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

相关文章

Ollama--本地大语言模型LLM运行专家

文章目录 1、问题提出2、解决方案3、Ollama介绍3.1、Ollama的核心功能3.2、Ollama的独特之处 4、Ollama安装与使用4.1、Ollama的安装 5、使用Docker6、模型库和自定义模型7、应用场景展望8、结语 1、问题提出 使用chatgpt之类的闭源大语言模型时&#xff0c;我们与ai沟通的数据…

javaEE基于springboot民宿推荐系统springmvc+mybatis+jsp]

该民宿推荐系统应能够完成民宿推荐信息发布的需求&#xff0c;程序安全&#xff0c;操作应简单易行&#xff0c;通过简洁美观的前端页面引导即可完成操作。从多角度多方面思考理解大众用户的功能需求&#xff0c;思考系统应该具备的核心功能模块&#xff0c;并完成相应开发。民…

如何用生成式人工智能准备和制作吸引人的美食视频?

YouTube是一个全球性的视频分享平台&#xff0c;上面充满了各式各样的内容&#xff0c;其中美食内容因其视觉和味觉上的双重吸引而备受欢迎。作为一个想要进入这个领域的创作者&#xff0c;你需要知道如何准备和制作吸引人的美食视频。以下是一些基本步骤和技巧&#xff1a; 选…

HUAWEI 华为交换机 配置 MAC 防漂移 防MAC伪造示例

组网需求 某企业网络中&#xff0c;用户需要访问企业的服务器。如果某些非法用户从其他接口假冒服务器的MAC 地址发送报文&#xff0c;则服务器的 MAC 地址将在其他接口学习到。这样用户发往服务器的报文就会发往非法用户&#xff0c;不仅会导致用户与服务器不能正常通信&…

ipv6过渡技术-IPv4 over IPv6隧道示例

实验拓扑如下&#xff1a; 环境概述&#xff1a; PC1和PC2与路由器之间为IPv4网络。两台路由器之间为IPv6网络&#xff0c;通过配置&#xff0c;要求是PC1与PC2能互通。即使IPv4可以在IPv6网络中通信。 配置方法&#xff1a; AR1&#xff1a; # ipv6 # interface Gigabi…

【译】WordPress Bricks主题安全漏洞曝光,25,000个安装受影响

WordPress的Bricks主题存在一个严重的安全漏洞&#xff0c;恶意威胁行为者正在积极利用该漏洞在易受攻击的安装上运行任意PHP代码。 该漏洞被跟踪为CVE-2024-25600&#xff08;CVSS评分&#xff1a;9.8&#xff09;&#xff0c;使未经身份验证的攻击者能够实现远程代码执行。它…

浅谈 Vue3 静态提升和预字符串化

前言 很多朋友在看到 Vue3静态提升 的时候很不理解&#xff0c;不明白这句话到底是什么意思&#xff0c;今天我们就通过这篇日记来搞明白。如果有什么地方描述不正确&#xff0c;请多多指正。 静态类型&#xff08;前置信息&#xff09; 判断节点是否为静态类型&#xff0c;…

机器学习的魔法(二)超越预测的界限-揭秘机器学习的黑科技-探索监督学习中的回归和分类问题

前面我们提到了监督学习的概念&#xff0c;现在我们来回顾一下&#xff0c;什么是监督学习。 监督学习指的是&#xff1a;我们给学习算法一个数据集&#xff0c;这个数据集由正确答案组合而成&#xff0c;然后机器运用学习算法&#xff0c;算出更多的正确答案。 1、监督学习之…

GIS之深度学习07:CUDNN教程(CUDA12.1配套)

CUDNN&#xff08;CUDA Deep Neural Network library&#xff09;是NVIDIA专门针对深度学习应用开发的GPU加速库。它提供了一系列高效的深度学习算法的实现&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;、循环神经网络&#xff08;RNN&#xff09;等常用网络结构的…

QT----QTcreater连接Mysql数据库

目录 1、下载驱动&#xff0c;放入文件夹2、编写代码&#xff0c;实现本地访问3、实现网络数据库3.1 更改权限3.2 修改代码 之前写了一个图书管理系统用的是sqlite3&#xff0c;现在想用mysql&#xff0c;部署到网上&#xff0c;实现远程访问。 1、下载驱动&#xff0c;放入文…

VR虚拟生态探索介绍|元宇宙文旅|VR设备价格

虚拟现实&#xff08;VR&#xff09;虚拟生态探索是一种通过VR技术让用户体验并探索虚拟环境的活动。在这样的环境中&#xff0c;用户可以通过头戴式显示器和其他感知设备沉浸在一个虚拟的世界中&#xff0c;仿佛身临其境。 在VR虚拟生态探索中&#xff0c;用户可以探索各种不同…

IDEA中如何配置多个版本的JDK

1.首先创建一个Project. 2.点击菜单栏中的File,而后选择Project Structure. 3.进入该界面后点击SDK选择想要选择的jdk版本。 4.如果提供的jdk版本没有自己想要的&#xff0c;就点击ADD SDK,点击DownLoad JDK; 5.在弹出的窗口选择jdk的版本和想要下载到的位置。 6.下载成功…

Mysql删除重复项:力扣196. 删除重复的电子邮箱

题目链接&#xff1a;196. 删除重复的电子邮箱 - 力扣&#xff08;LeetCode&#xff09; 题目描述 sql语句 # Write your MySQL query statement below delete a from person as a inner join person as b where a.email b.email and a.id > b.id 思路&#xff1a;内连接…

Spring事件发布监听器ApplicationListener原理- 观察者模式

据说监听器模式也是mq实现的原理, 不过mq我还没来得及深入学习, 先用spring来理解一下吧 Spring事件发布监听器ApplicationListener原理- 观察者模式 什么是观察者模式一个Demo深入认识一下观察者模式Spring中的事件发布监听ps 什么是观察者模式 大家都听过一个故事叫做烽火戏…

GPT-4 及更高版本:大型语言模型的力量

GPT-4革命&#xff1a;人工智能如何重塑SEO行业 在人工智能领域&#xff0c;GPT-4 等语言模型的演变标志着一个重要的里程碑。 本文深入探讨了 GPT-4 的功能和潜力&#xff0c;同时也思考了人工智能领域的未来。 GPT-4 的出现&#xff1a;人工智能的新时代OpenAI 开发的 GPT-4…

MySQL 缓存策略

MySQL 缓存方案用来干什么 ? 缓存用户定义的热点数据&#xff0c;用户直接从缓存中获取热点数据&#xff0c;降低数据的读写压力。场景分析 内存访问速度是磁盘访问速度的 10 万倍。读的需求远远大于写的需求MySQL 自身缓冲层跟业务无关。MySQL 作为项目主要数据库&#xff0…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包&#xff0c;却显示找不到依赖&#xff0c;刷新一下maven 二…

word转PDF的方法 简介快速

在现代办公环境中&#xff0c;文档格式转换已成为一项常见且重要的任务。其中&#xff0c;将Word文档转换为PDF格式的需求尤为突出&#xff0c;将Word文档转换为PDF格式具有多方面的优势和应用场景。无论是为了提高文档的可读性和稳定性、保障文档的安全性和保护机制、还是为了…

赛力斯造车引入强援,原华为智选车产品部部长加盟,任集团副总裁

作者 |德新 编辑 |王博 HiEV从多个信息源获悉&#xff0c;赛力斯造车近日引入一位业界大牛。原华为智选车产品部部长李博已于近日加盟&#xff0c;出任赛力斯集团副总裁。 李博是服役华为多年的老将&#xff0c;长期供职于华为终端生态。在华为体系中&#xff0c;产品部部长相…

Java基础数据结构之队列

一.什么是队列 队列是一种先进先出的数据结构&#xff0c;也就是从左边进从右边出&#xff0c;或者说&#xff0c;只允许在一端插入元素&#xff0c;在另一端删除元素 进行插入操作的一端称为队尾&#xff08;tail/rear&#xff09;&#xff0c;删除操作的一段称为队头&#…