Linux---gcc编译

news2025/1/12 13:27:05

目录

前言

一、gcc编译

二、程序的编译过程

三、gcc查看编译过程

1.预处理阶段

2.编译

3.汇编 

4.链接 

动静态库链接的内容

动静态库链接的优缺点

5.总结记忆 


前言

在前面我们学会使用vim对文件进行编辑,如果是C或者C++程序,我们编辑好了内容还需要编译,此时就可以使用gcc和g++进行编译了。

一、gcc编译

编译的方法很简单,gcc编译c语言文件,g++编译c/c++文件,后面接你编辑好的文件名就行,如下。编译完成后生成了可执行文件a.out。

 注意虽然linux文件不看后缀,但是gcc/g++会看后缀,只有cpp、c、cc、cxx后缀才能被编译。如下编译会报错。

二、程序的编译过程

C程序的编译需要以下四个阶段  预处理、编译、汇编、链接

我们先来了解一下编译器的发展史:

        由于计算机只认识二进制,一开始程序员使用二进制与计算机沟通,后面利用二进制写出来了汇编编译器,使汇编代码可以转化为二进制代码,因此程序员可以使用汇编语言进行程序编写,后来又使用汇编语言编写了C语言编译器,因此程序员又可以使用C语言进行代码的编写,这样一来大大的降低了与机器沟通的难度。

        总结一下就是从二进制到汇编再到C语言

C程序编译的阶段就是这部发展史的反向操作。从C到汇编再到二进制。

下面是编译各个阶段的主要工作

预处理阶段

头文件展开

去注释

条件编译

宏替换

编译将C语言编译成汇编代码
汇编将汇编代码转为可重定位的二进制文件
链接链接生成可执行文件

三、gcc查看编译过程

1.预处理阶段

gcc -E 预处理阶段处理完就停止,运行如下,-o code.i是将结果输出到 code.i。

我们通过vim来看看两份文件的区别。 我们发现code.i将头文件展开了,变成了800多行的代码,并且中间缺失的部分是我们所注释掉的,这也印证了gcc -E 是预处理结束就停止。

2.编译

gcc -S是到编译工作做完就停止。运行如下,这里我们已经有了code.i,因此直接拿预处理过的文件继续向下编译。

我们vim code.s查看一下,都是汇编代码 

3.汇编 

gcc -c 执行到汇编工作完成就停下来。

vim code.o查看一下都是乱码,我们已经看不懂了。

用二进制方式查看一下,  od 文件后发现都是二进制。code.o文件已经相当于windows里面的obj文件了。该二进制文件还没有进过链接,还无法执行。

4.链接 

 链接是链接上库里面的内容,.o文件+系统库就可以生成可执行程序了。

这里的系统库分为静态库(.a)和动态库(.so)。 我们使用ldd mybin 来查看我们的可执行程序依赖了那些库。这里发现依赖的三个库都是动态库。

其他库我们可能不清楚,但是图片中的libc.so.6,我们对他进行拆分,去掉前面的lib,再去掉后面的.so.6。我们发现只剩下了一个c,这就是大名鼎鼎的C标准库。 并发现这个库存在我们系统里,他的路径是 /lib64/libc.so.6。

动静态库链接的内容

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

动态链接过程:编译器会告诉该程序需要链接的库地址,到时候程序通过这个地址找到库里面的内容并链接起来。

很多文件或者程序都会依赖动态库,如果缺失这个动态库,代码就执行不起来,程序也会崩掉,都会收到影响。

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

静态库的缺失只会影响自己,不会影响到其他程序。

动静态库链接的优缺点

动态库链接

优点:形成的可执行程序体积小,节省资源。

缺点:可执行程序依赖动态库,库文件丢失,程序崩溃。

静态库连接

优点:形成的可执行程序体积太大,浪费资源

缺点:可以独立运行。

我们分别动静态链接测试一下

普通gcc编译为动态链接,生成code-d

 静态链接可能需要安装静态库,使用下面代码

sudo yum install -y glibc-static
sudo yum install -y libstdc++-static

安装好之后进行静态链接,生成code-s ,静态链接在普通编译后面接上一个-static就可以了。

我们发现他们的大小相差非常大,有着百倍的差距。这也是为啥gcc默认采用动态链接的原因,静态链接文件太大了

5.总结记忆 

之前的阶段这么多,每一次执行的代码都不一样,但其实很好记忆。

编译方式 -ESc   后缀.iso 分别代表(预处理、编译、汇编)

ESc注意前面两个大写,后一个小写,这是键盘左上角的三个

iso为系统镜像后缀,记住这两点就可以了。

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

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

相关文章

嵌入式-Stm32-江科大基于寄存器点亮LED灯

文章目录 前言:一:搭建基于寄存器控制LED的工程二:用江科大的STM32板子实现基于寄存器点亮LED灯三:用非江科大stm32板子实现基于寄存器点亮LED灯道友:一星陨落,黯淡不了星空灿烂;一花凋零&#…

脚本编程游戏引擎会遇到哪些问题

在游戏开发中,脚本编程已经成为了一种非常常见的方式,用来实现游戏逻辑和功能。但是脚本编程游戏引擎也可能会面临一些挑战和问题。下面简单的探讨一下都会遇到哪些问题,并且该如果做。 性能问题 脚本语言通常需要运行时解释执行&#xff0…

3.4 在开发中使用设计模式

现在,我们应该对设计模式的本质以及它们的组织方式有了初步的认识,并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨,我们打下了坚实的基础。初步了解了UML的基本构建模块后,我们现在可以…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述,认认真真看,对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试(NCRE),从今年起&#xff0…

python json模块

json是JavaScript对象表示法的缩写,是一种轻量级的数据交换格式,经常被用于Web应用程序中。python中的json库是用于解析和生成json数据格式的库。 import jsondata {"name": "张三","age": 18,"hobbies": [&q…

Gitlab-ci:从零开始的前端自动化部署

一.概念介绍 1.1 gitlab-ci && 自动化部署工具的运行机制 以gitlab-ci为例: (1) 通过在项目根目录下配置.gitlab-ci.yml文件,可以控制ci流程的不同阶段,例如install/检查/编译/部署服务器。gitlab平台会扫描.gitlab-ci.yml文件&…

遥感单通道图像保存为彩色图像

系列文章目录 第一章PIL单通道图像处理 文章目录 系列文章目录前言一、代码实现二、问题记录在这里插入图片描述 总结 前言 将单通道图像以彩色图像的形式进行保存主要使用了PIL库 一、代码实现 palette_data [***]:可以进行自定义设置 代码如下: fr…

字体图标操作步骤

网站 直接点击 进去后长这样,点免费的添加 保存下载 保存后解压 把fonts文件夹复制粘贴到我们自己项目 可以放在同images的路径下 引入 来源于 再style中粘贴 font-face {font-family: icomoon;src: url(fonts/icomoon.eot?jyg4cp);src: url(fonts/icomoo…

UVa12304 2D Geometry 110 in 1!

题目链接 UVa12304 2D Geometry 110 in 1! 题意 这是一个拥有6(二进制是110)个子问题的2D几何问题集。 1 CircumscribedCircle x1 y1 x2 y2 x3 y3:求三角形(x1,y1)-(x2,y2)-(x3,y3)的外接圆。这3点保证不共线。答案应格式化成(x,y,r…

C++从零基础到入门(1)

目录 一、输入输出 (iostream库) 1.标准输出流cout 2.标准输入流cin 3.标准库iostream (1)iostream中的窄字符(char) (2)iostream中的 宽字符(wchar_t) 二、变量与数据类型 …

Map与JSONObject区别

相同点: 都可以存key-value;key是唯一的,如果key重复了会覆盖前面的 不同点: (1)JSONObject 不可以存空,Map可以存空。 (2)Map由jdk提供,JsonObject需要第三方jar包提供。…

搜索与图论第一期 DFS(深度优先搜索)

前言 DFS这部分难度不大,大家应该完全掌握!!! 一、DFS的基本内容 内容: 深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2&#…

使用Linux防火墙管理HTTP流量

在Linux系统中,防火墙是用于控制网络流量的重要工具。通过防火墙,你可以根据需要限制、过滤或允许特定的网络流量,从而提高系统的安全性。在处理HTTP流量时,防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…

【NVIDIA】Jetson Orin Nano系列:烧写Ubuntu22.04

1、简介 最新的sdk-manager已经可以安装到Ubuntu22.0,也支持在 Jetson Orin Nano 上烧写Ubuntu22.04。 官网介绍:https://developer.nvidia.com/sdk-manager 2、版本介绍 JetPack版本:https://developer.nvidia.com/embedded/jetpack-ar…

Camunda Event Based Gateway

一:bpmn 二:java 如果没有收到信号,超过等待时间,流程进入总经理审批,如果在等待时间内收到信号,流程进入副总经理审批。 示例1:发送信号事件,流程进入副总经理审批。 repository…

vue element-ui的table列表中展示缩略图片效果实例

这篇文章主要给大家介绍了关于vue element-ui的table列表中展示多张图片(可放大)效果的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下 一、效果图 二、代码部分 1、原理 使用 <el-table-column> 和 <el-image> 组件来在表格中插入缩略图 2、te…

学习笔记之——3D Gaussian Splatting源码解读

之前博客对3DGS进行了学习与调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研-CSDN博客文章浏览阅读450次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作&#xff0c;它的特点在于重建质量高的情况下还能接入传统光栅化&#xff0c;优…

CMU15-445-Spring-2023-Project #2 - B+Tree

前置知识&#xff1a;参考上一篇博文 CMU15-445-Spring-2023-Project #2 - 前置知识&#xff08;lec07-010&#xff09; CHECKPOINT #1 Task #1 - BTree Pages 实现三个page class来存储B树的数据。 BTree Page internal page和leaf page继承的基类&#xff0c;只包含两个…

人工智能:未来智慧城市建设的“智慧大脑”与核心价值

目录 一、引言 二、人工智能在智慧城市中的应用实例 三、人工智能对智慧城市建设的核心价值 四、面临的挑战与未来展望 五、结语 六、附&#xff1a;智慧城市全套解决方案大合集 - 下载 一、引言 随着科技的飞速发展&#xff0c;智慧城市的概念逐渐深入人心。智慧城市利…

爬虫你需要知道的:什么是http请求

1. 什么是http请求 我们将通过发送http请求来获取网页内容。http是HyperText Transfer Protocol的缩写&#xff0c;意思是超文本传输协议&#xff0c;它是一种客户端和服务器之间的请求响应协议。 浏览器就可以看作是一个客户端&#xff0c;当我们在浏览器地址栏输入想访问的…