【Linux】gcc/g++

文章目录

  • gcc/g++的使用
  • 使用方法:
  • 程序翻译的四个阶段
      • 预处理阶段
      • 编译阶段
      • 汇编阶段
      • 链接阶段
  • 库函数的命名和分类(动静态库)
  • 动静态库的区别与优缺点

gcc/g++的使用

gcc:C语言编译器,只编译C语言文件
g++:C++编译器,C/C++都可以编译

使用方法:

1.生成默认的可执行文件:a.out

gcc test.c

2.自定义可执行程序的名字

gcc test.c -o 自定义名字

3.使用C99标准来编译

gcc test.c -std=c99

那么生成的可执行程序是什么样的呢?
编译后,会在当前目录生成一个
可执行程序,此文件通常是绿色的

在这里插入图片描述

如何指向代码呢?

输入./a.out

程序翻译的四个阶段

早在C语言阶段我们就已经了解了程序编译的四个阶段,现在我们再来熟悉一下。

预处理阶段

预处理阶段包括四个方面:
1.头文件展开
2.去掉注释
3.条件编译
4.宏替换

接下来用指令验证一下:

gcc -E test.c -o test.i

在这里插入图片描述
vim指令打开test.i文件
在这里插入图片描述

,我们写的代码在最下面
然而上面还有几百行其实就是头文件展开
所谓头文件展开就是:
将头文件的内容拷贝到当前文件
在头文件中有许多空行,这是
因为原先的头文件有注释,此时注释已经没了

编译阶段

编译阶段的主要工作是将C语言翻译为汇编代码。

同样的也可以输入指令验证:
gcc -S test.i -o test.s
将程序停留在编译过程后,生成.s文件

这里就靠大家自行验证了。

汇编阶段

汇编阶段的主要工作是:
将汇编代码变成可重定位二进制文件,文件里存放的是二进制信息。

同样的输入指令:

gcc -c test.s -o test.o

将程序停留在汇编过程后,形成.o文件
在这里插入图片描述

链接阶段

链接阶段比较复杂,它大致的流程是这样的:

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

库函数的命名和分类(动静态库)

我们在写C语言代码时使用的printf函数
并没有自己实现,然而在stdio.h头文件中
也只有printf函数的说明,那么此函数的
实现是在哪里实现的呢?

查看一个可执行程序依赖的第三方库。

使用指令: ldd 可执行程序名

在这里插入图片描述
在路径lib64里有一个文件叫libc.so.6,这个就是刚刚的C语言程序所要依赖的库。

如何解释库呢?看到下面这张图片相信会有答案。
在这里插入图片描述
libc.so.6实际上就是C的标准库!

Linux和Windows下动静态库命名区别有什么区别呢?

Linux下: .so 是动态库 .a 是静态库
Windows下: .ddl 是动态库 .lib 是静态库

到了这里相信就可以很容易的理解链接的过程了。
链接过程就是将.o文件和动/静态库结合的过程。

动静态库的区别与优缺点

区别:
动态库是共享库,通过函数地址来关联程序
静态库是私有库,可以独立运行

动态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来。

静态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!

说白了,静态库是将所有代码拷贝过来
而动态库是去找函数的地址调用此函数

动静态库的优缺点: 动态库: 优点:形成的可执行程序体积较小,节省资源 缺点:要找函数地址,会稍慢一点,并且有强依赖性

静态库: 优点:无视库,可以独立运行 缺点: 体积太大,浪费资源

如何当你想使用静态库编译代码该怎么做呢?
只需输入指令: gcc code.c -static即可。

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

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

相关文章

LabVIEW学习记录3 - 自定义函数

LabVIEW学习记录3 - 自定义函数 一、LabVIEW学习记录二、自定义函数及函数调用 一、LabVIEW学习记录 【labVIEW】学习记录LabVIEW学习记录2 - MySQL数据库连接与操作LabVIEW学习记录 - 实时显示时间LabVIEW学习记录4-局部变量、全局变量、共享变量 二、自定义函数及函数调用 …

vue项目启动后页面显示‘Cannot GET /’

1、npm run dev命令启动项目的时候没有报错,页面打开却提示 Cannot GET / 2.这个时候只需要找到config文件夹下面的index.js文件。把assetsPublicPath字符串的:‘./’修改成 ‘/’就行了。修改完之后记得关闭项目,然后重新启动。不然不会生效…

假如文档管理有段位,统信UOS V20桌面专业版(1070)堪称王者丨年度更新

信息爆炸,文档繁杂 当代打工人如何清爽开启每一天? 统信UOS V20桌面专业版(1070) 自研文件管理器 帮你上大分! 在数字化时代,文件管理成为了我们日常生活和工作中不可或缺的一部分。无论是个人用户还是企业…

沃比得 DP12A 对数周期天线 100MHz~2GHz

产品概述 DP12A 对数周期天线该天线可用做超短波发射或接收天线,工作频率为 100MHz~2GHz。 具有频带宽,性能可靠,增益高等优点,是理想的无线电频谱管理、EMC 测试、电子对抗等领 域的定向接收、发射天线。 应用领域…

MySQL—子查询

目录 ▐ 子查询概述 ▐ 准备工作 ▐ 标量子查询 ▐ 列子查询 ▐ 表子查询 ▐ 多信息嵌套 ▐ 子查询概述 • 子查询也称嵌套查询,即在一个查询语句中又出现了查询语句 • 子查询可以出现在from 后面 或where后面 • 出现在 from 后称表子查询,结…

【数字图像处理笔记】Matlab实现图像平滑算法 均值-中值-高斯滤波 (三)

💌 所属专栏:【数字图像处理笔记】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#x…

autolabor(ROS开发笔记)__1

视频链接:ROS机器人 chapter 1 ROS概述与环境搭建 学习步骤: 1.了解该模块的相关概念 是什么,为什么学,前世今生,发展前景 2.安装官方软件包 具备基本的开发环境,简陋notepad 3.搭建集成开发环境(IDE,Int…

Unity射击游戏开发教程:(14)Unity 中的相机抖动

我以为这将是一个很容易添加到我的游戏中的功能,但编程中没有什么,尤其是刚开始的 GameDev。经过对如何创建相机抖动效果的一些研究后,有很多不同的方法来实现它。有一种使用动画、Cinemachine 或使用脚本的方法。本文将介绍如何创建脚本来创建相机抖动效果。现在,该脚本取…

SpringBoot 使用Outlook邮箱发送邮件

目录 一、开启Outlook设置 二、依赖 三、配置文件 四、代码调用 一、开启Outlook设置 开启设置如图&#xff1a; 二、依赖 <!-- 邮箱依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mai…

SQLZOO:The JOIN operation

数据表&#xff1a;game-gaol-eteam game idmdatestadiumteam1team210018 June 2012National Stadium, WarsawPOLGRE10028 June 2012Stadion Miejski (Wroclaw)RUSCZE100312 June 2012Stadion Miejski (Wroclaw)GRECZE100412 June 2012National Stadium, WarsawPOLRUS... goal …

向计算机输入两个整数,用一个函数求出两数之和

在一个函数中调用另一函数&#xff08;即被调用函数&#xff09;需要具备哪些条件呢&#xff1f; &#xff08;1&#xff09;首先被调用的函数必须是已经存在的函数&#xff08;是库函数或者用户自己定义的数&#xff09;&#xff0c;但光有这一条件还不够。 &…

本地生活市场竞争激烈,自营外卖平台实现月入上万,很轻松!

在中国&#xff0c;大约有300个地级市、2000个县&#xff08;包括县级市&#xff09;、4万个乡镇和66万个村庄&#xff0c;一起组成了近10亿人口的下沉市场。在本地生活领域&#xff0c;谁能够把握这一群体&#xff0c;谁就可能控制市场的主导地位。 大型平台是否可以把在一二…