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

这篇具有很好参考价值的文章主要介绍了【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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、登陆成功后, 进入个人主页,按钮新建项目。

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee,Linux,linux,算法,运维

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee,Linux,linux,算法,运维

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee,Linux,linux,算法,运维

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee,Linux,linux,算法,运维

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

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee,Linux,linux,算法,运维


本章完。 文章来源地址https://www.toymoban.com/news/detail-838822.html

到了这里,关于【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【UNIX 环境编程】GCC 编译器 | Makefile 基础入门 | GDB 调试教学

    💭 写在前面: 本文将介绍如何使用 GCC 编译器编译,并详细介绍了 Makefile 的基本构造、创建Makefile 文件以及 Makefile 变量,以提高编译效率。此外,本文还将探讨GDB调试器的使用,包括调试前的准备、readelf 读取 ELF 文件信息、显示代码、断点、调试、监视、跳转等内容。 

    2024年02月03日
    浏览(71)
  • Linux:编译器 - gcc

    GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器。本博客只讲解gcc,g++的语法和选项和gcc都是一致的。 gcc 编译

    2024年04月14日
    浏览(83)
  • Linux GCC常用命令以及GCC编译器

    GCC 是编译工具,它的意思是 GNU C Compiler 。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等。而 GCC 也不再单只是 GNU C 语言编译器的意

    2024年02月05日
    浏览(46)
  • Linux——gcc/g++编译器

    目录 I.Linux编译器 1.gcc/g++编译器 在C代码生成可执行程序的过程中,会有四个过程: 1预处理,2编译,3汇编,4链接 Linux对.c文件分辨进行预处理,编译,汇编三大步指令: 预处理指令: 编译指令: 汇编指令: 接下来说一说链接过程: II.动静态链接  一.动态链接 二.静态链接

    2024年02月04日
    浏览(49)
  • Linux编译器gcc/g++

    以gcc编译 以g++编译,但是此时会发现没有g++这个指令,所有需要安装它,安装指令 yum install gcc gcc-c++ gcc和g++都会形成可执行文件a.out gcc只能编译c语言代码,g++能编译c/c++ 以c程序为例,来看看它从一个文本类的c程序编译成计算机可以认识的二进制程序它需要经过四个阶段 预

    2024年02月10日
    浏览(44)
  • 【Linux】03 GCC编译器的使用

     在使用gcc编译程序时,编译过程可以简要划分为4个阶段:         预处理、编译、汇编、链接 这个阶段主要处理源文件中的#indef、#include和#define预处理命令; 这里主要是把一些include的头文件和一些宏定义,放到源文件中。 编译命令: gcc  -E  -o  hello.i  hello.c 将经过预处

    2024年01月20日
    浏览(55)
  • Linux编译器——gcc/g++使用

    前言:  在上一篇,我们学习了关于文本编辑器 vim 的全部知识,今天给大家带来的是关于Linux编译器—gcc/使用的详细介绍。 本文目录  (一)温习程序的产生的过程 1、前言 2、程序的产生过程 3、🌜初步认识 gcc🌛 a) gcc的基本概念 b)gcc的基本特点 4、使用方法💻 (二)

    2023年04月17日
    浏览(55)
  • 【Linux】编译器-gcc/g++使用

    个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。 我们先写一段简单的代码: 当我们进行编译的时候: 发现根本就编译不了。 这个是因为编译器版本的问题: 查看编译器的版

    2024年03月11日
    浏览(129)
  • Linux--编译器-gcc/g++使用

    目录 前言 1.看一段样例  2.程序的翻译过程 1.第一个阶段:预处理 2.第二个阶段:编译 3.第三个阶段:汇编 4.第四个阶段:链接 3.程序的编译为什么是这个样子? 4. 关于编译器 5.链接(动静态链接) 1.首先,我们来看一段样例(见一下) 2.见完之后,我们来看一下程序的翻译

    2024年02月20日
    浏览(64)
  • Linux编译器 gcc与g++

    程序的编译过程: 1、 预处理 (头文件包含、消除注释、宏定义替换) 2、 编译 (将语言替换成汇编代码) 3、 汇编 (将汇编指令转换为二进制指令) 4、 链接 (合并段表、符号表合并及重定位) 我们可以通过gcc工具实现程序的编译过程: 2.1 预处理 预处理会完成:①头

    2023年04月18日
    浏览(75)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包