Linux编译器gcc/g++介绍

news/2024/7/5 4:23:22

gcc/g++编译器介绍

编译器的功能就是把代码经过一系列处理变成可执行文件,然后就可以执行文件实现代码的功能。

gcc编译器编译C语言文件,g++编译C++文件,g++也可以编译C语言,但gcc不能编译C++文件。

gcc使用方法:gcc [选项] 要编译的文件 [选项] [目标文件] g++和gcc使用方法相同。

常见的C++文件后缀有.cpp|.cc|.cxx

注意以下代码使用gcc编译时可能会报错,代码本身没有语法问题。

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5   for(int i = 0; i < 10; i++)
  6   {
  7     printf("123\n");
  8   }
  9   return 0;      
 10 }

image-20231104204935434

报错显示第五行在for循环里定义变量是c99才有的,所以我们在编译时还要手动设置c99标准来编译该代码

加了标准之前:gcc code1.c

加了标准之后:gcc code1.c -std=c99

程序翻译过程:

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接
  5. 生成可执行程序

在介绍程序翻译过程之前我们先介绍一下编译器的发展史,更有利于理解后面的程序翻译。

编译器的发展史

​ 计算机语言最开始是二进制语言,所有指令都由0101组成,因为二进制语言比较麻烦所以后面就发明了汇编语言。计算机只能读懂二进制,所以以前的人们还得开发一个软件汇编语言翻译成二进制语言才能让计算机读懂,所以人们就开发出了这样的软件,这个软件只能用二进制语言来写,这样才能让计算机运行这个软件把汇编语言翻译成二进制语言。这个软件就叫做编译器,因为是二进制语言写的所以就叫二进制编译器

​ 随着时间的流逝,人们发现汇编语言也不是很方便,于是就发明了高级语言,比如C语言。这时候又需要一个软件来把高级语言翻译成汇编语言,然后再由二进制编译器汇编语言翻译成计算机看得懂的二进制语言。这个软件就叫做汇编编译器,这样我们就能比较方便的进行编程了。

image-20231104165111547

​ 既然我们有了汇编编译器二进制编译器,那么我们就可以重写编译器,比如用汇编语言重写二进制编译器,用高级语言重写汇编编译器,于是就变成了下面这样:

image-20231104170400613

​ 因为我们还有汇编编译器(汇编语言写的)二进制编译器(二进制语言写的),所以就能翻译高级语言写的汇编编译器汇编语言写的二进制编译器

​ 有人说为什么不直接把高级语言翻译成二进制语言呢?可以但没必要,因为已经有人造好了轮子,在人们发明了高级语言时只需要写一个编译器翻译成汇编语言即可,不需要再大费周章的写一个编译器把高级语言翻译成二进制语言。

程序翻译的过程

假设我们有一个代码名为code.c

  1. 预处理

    gcc -E code.c -o code.i这句代码的意思是对程序进行翻译,做完预处理就停止,生成的文件重命名为code.i

    • 头文件展开(编译前十几行的代码在头文件展开后可能有一千行)
    • 去注释
    • 条件编译(通过条件编译可以实现对代码的动态裁减)
    • 宏替换
  2. 编译

    gcc -S code.i -o code.s这句代码的意思就是从现在开始对程序进行翻译,做完编译就停止,生成的文件重命名为code.s

    • 检查代码的规范性,是否具有语法错误
    • 将C语言翻译成汇编语言
  3. 汇编

    gcc -c code.s -o code.o这句代码的意思就是从现在开始对程序进行翻译,做完汇编就停止,生成的文件重命名为code.o

    • 把编译阶段生成的.s文件转成目标文件
    • 虽然code.o已经是二进制文件了,但此时无法执行code.o文件,不过可以编译形成可执行程序
  4. 链接

    *.o+系统库=可执行程序

    系统库就是函数库,下面我们将会详细介绍。

函数库

​ 用C语言举例,我们的熟知的printfscanf函数,我们自己没有定义又为什么能用呢?实际上这些函数的实现都放在库文件里去了,这些库都在特定的路径下,一般没有指定时,编译器会去系统默认搜索路径查找。而在Linux中,这个路径为usr/lib,我所用的CentOS7系统的printf函数存放在libc.so.6的库文件中。函数库分为静态库和动态库。

ldd [文件名]可以查看该文件所依赖的动态库文件

静态库和动态库

Linux下动态库是.so,静态库是.a,Windows下静态库的后缀是.dll,静态库是.lib

动态库:是C/C++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式关联起来,这种称为动态链接。库中所有的函数,都有入口地址,所谓的动态链接,其实就是把要连接的库中的函数地址拷贝到我们可执行程序的特定位置,也就是链接的合并符号表

静态库:是C/C++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中,这种叫做静态链接

动态库的优缺点

优点:形成的可执行程序体积比较小,比较节省资源。(磁盘和内存)

缺点:稍慢一点,因为要通过函数地址找到函数的实现。强依赖动态库,动态库没了,所有依赖这个库的程序都无法运行了

静态库的优缺点

优点:无视库,可以独立运行

缺点:体积太大,浪费资源

​ 动态库居多,静态库比较少,下面是使用动态链接和静态链接文件的对比:

gcc code.c -o code-s -static后面加上-static就是静态链接的方式编译

image-20231104202303316

code-s是静态链接编译的,code.exe是动态链接编译的,很明显可以看到静态链接的可执行文件大小比动态链接的大的多。

​ 当然这里有些人使用静态链接的方式编译时可能会报错,因为有些云服务器是没有安装静态库的,需要手动安装,输入以下代码:

C: sudo yum install glibc-static

C++: sudo yum install -y libstdc++-static

​ 从上面可以看出系统一般自带动态库,而不是静态库,编译器默认链接的方式也是动态链接,原因是:

系统中有各种各样的软件,如果每个程序都是用静态链接的方式,那么每个程序执行时都要拷贝一份静态库,最后在内存里就会有很多相同的静态库,就会极大的浪费内存资源。

这也就是为什么动态库比静态库多的原因了


​ 所以,我们的开发环境,默认都要为我们做什么呢?

  • 下载开发环境
  • 设置合理的查找路径
  • 规定好我们形成可执行文件的链接方式

http://lihuaxi.xjx100.cn/news/1753009.html

相关文章

Java,面向对象,枚举类

枚举类型本质上也是一种类&#xff0c;只不过这个类的对象是有限的、固定的几个&#xff0c;不能让用户随意创建。 场景&#xff1a; 开发中&#xff0c;如果针对于某个类&#xff0c;它的实例的个数是确定的。则推荐将此类声明为枚举类。 如果枚举类的实例只有一个&#xff0c…

社群团购对接合作,你有研究过社群团购平台的选品吗?

社群团购对接合作&#xff0c;你有研究过社群团购平台的选品吗&#xff1f; 社群团购选品是非常重要的一项工作&#xff0c;一个好的社群团购平台选品逻辑包含了&#xff1a;用户定位&#xff0c;时节性&#xff0c;产品性价比&#xff0c;售后率。用户定位在选品过程中非常重要…

水经微图Web版从入门到精通

我们在《47GB水经微图从入门到精通视频教程》和《163M水经微图从入门到精通文档教程》中&#xff0c;为大家分享了水经微图PC版的教程。 这里&#xff0c;我们再为大家分享水经微图Web版的文档教程。 水经微图Web版教程 水经微图Web版的教程&#xff0c;主要包括基础名词、…

好物周刊#29:项目管理软件

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. HelloGithub 分享 GitHub 上有趣、入门级的开源项目。每月 28 号以月刊…

ant的Replace任务(task)

replace将选定文件中的一个字符串替换为另外一种字符串。 file属性&#xff1a;指明要替换字符串标记&#xff08;token&#xff09;的一个文件。该属性和dir属性必须出现一个。dir属性&#xff1a;如果要替换多个文件中的字符串标记&#xff0c;该属性指明了基目录。该属性和…

品牌方对接社群团购如何在双11做到刺激销售?

品牌方对接社群团购如何在双11做到刺激销售&#xff1f;做好准备工作 双11是全年电商销售的销量爆发的重要节点&#xff0c;考验的是品牌和商家的全链路的运营能力 商业的终局是私域&#xff0c;因为生意的本身就是信任和信心和信息 而私域的对接合作都建立在客户对我们的深度信…

面向教育的计算机视觉和深度学习5

面向教育的计算机视觉和深度学习5 1. 好处智能内容&#xff08;Smart Content&#xff09;任务自动化&#xff08;Task Automation&#xff09;缩小技能差距&#xff08;Closing Skill Gap&#xff09; 2. 应用程序学生学习与福利&#xff08;Student Learning and Welfare&…