加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

【Linux】编译器gcc / g++的使用

发布时间:2023-01-10 14:02:22 所属栏目:Linux 来源:网络
导读: 专栏:《学会Linux》
座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根

目录
gcc / g++的介绍
gcc(GNU C Compiler)是 GNU 退出

专栏:《学会Linux》

座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根

在这里插入图片描述

目录

gcc / g++的介绍

gcc(GNU C Compiler)是 GNU 退出的功能强大、性能优越的多平台编译器,其可以编译利用 C语言、C++ 和 Object C 等语言编写的程序。gcc 编译出的目标代码质量非常好,编译速度也很快,并且 gcc 是一个交叉平台编译器,它能够在当前处理器平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合嵌入式领域的开发编译。

我们都知道,一份 C语言代码的翻译过程分为预处理、编译、汇编和链接。那我们就用下图的代码来测试这四个过程。

在这里插入图片描述

在这里插入图片描述

程序的翻译过程

程序的翻译包括预处理、编译、汇编和链接四个过程。

预处理

预处理主要做的事情是宏的替换、头文件的展开、条件编译和删除注释等。预处理指令是以 # 开头的代码行。预处理后的代码还是 C语言代码。

gcc -E test.c -o test.i
# "-E"选项的作用是让gcc在预处理结束后停止编译过程
# "-o"是指目标文件,".i"文件为经过预处理后的C语言代码
# 如果不加"-o"选项,预处理后的结果将会打印在显示器上

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

命令行传参

在这里插入图片描述

C / C++ 包含的头文件必须存在与系统中,如果头文件不存在linux编译器,就会报错。那我们 C / C++ 包含的头文件,就在/usr/include/路径下。

在这里插入图片描述

那我们打开stdio.h文件来看一下。

在这里插入图片描述

头文件的意义:告诉我们如何使用头文件里面的函数(函数声明)和支持代码自动补齐。有函数的声明是不行的,还需要有函数的实现。而函数的实现在函数库里,这个在链接部分的内容里讲解。

编译

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作。在检查

无误后,gcc 把代码翻译成汇编语言。

gcc -S test.c/test.i -o test.s 
# "-S"选项是只进行编译而不进行汇编,生成汇编代码
# ".s"文件为经过编译后生成的汇编代码

汇编代码

在这里插入图片描述

注:汇编代码不能够直接被计算机执行。

汇编

汇编阶段是把编译阶段生成的汇编代码编程二进制代码

gcc -c test.c/test.s -o test.o
# "-c"选项是汇编结束后停止,生成二进制目标文件(".o"文件,不可执行)

二进制代码

在这里插入图片描述

在这里插入图片描述

注:二进制目标文件不可执行,需要再进行链接过程才能变成可执行程序。

在这里插入图片描述

链接

gcc test.o #默认生成可执行程序a.out
gcc test.c/test.o -o 可执行程序名	#生成指定的可执行程序

在这里插入图片描述

巧记预处理、编译和汇编

选项-ESc,生成的临时文件.iso

动静态链接

动静态链接的感性认识

在这里插入图片描述

动态链接形成的可执行程序体积小,节省资源(内存、磁盘和网络等等);而静态链接不受库升级或者库被删除的影响,形成的可执行程序体积大,占用资源多。

在这里插入图片描述

注:去掉前缀 lib 和后缀 .so 剩下的就是库名称。如:libc.so.6 就是 C 标准库。

在这里插入图片描述

在这里插入图片描述

可以看到,静态链接生成的可执行程序的体积比动态链接生成的可执行程序大上 100 多倍。

在这里插入图片描述

注:Linux 指令也是用 C语言写的可执行程序,这些指令也是动态链接 C 标准库生成的。如果我们删掉了 C 动态库,那么很多 Linux 指令都会无法使用了。C语言的动态库只有一份,不会出现重复的库代码。因此,动态库也称为共享库。以后我们要是下载一个 C语言写的程序,不需要卸载 C语言的标准库。

静态链接拷贝的是 .a 结尾的静态库。动态链接链接的是动态库,静态链接链接的是静态库。一般而言,系统会自动携带动态库(系统运行的需要)。静态库一般不存在,如果不存在需要自己安装。

在这里插入图片描述

sudo yum install -y glibc-static #安装C语言的静态库
sudo yum install -y libstdc++-static #安装C++的静态库

g++ 的使用

在这里插入图片描述

在这里插入图片描述

系统为了支持我们写代码,给我们提供了什么?系统给我们提供了标准库的 .h 文件(函数的声明)和标准的动静态库 .so / .a(函数的实现)。除了 Linux 系统,Windows 系统的原理也是一样的。Windows 系统的动态库为 .dll,静态库为 .lib。

脚本语言

#1/bin/bash
total=0
count=1
while [ $count -le 100 ]
do
    let total+=count
    let count++
done
echo "result: $total"

在这里插入图片描述

#!/usr/bin/python3
print("hello python")

在这里插入图片描述

总结

本篇博客主要讲解了程序的翻译过程(预处理、编译、汇编和链接)以及动静态链接等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!??

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!