Linux基础之gcc/g++

news2024/11/19 16:46:18

目录

一、gcc/g++的介绍

二、一个程序的翻译过程

2.1 预处理阶段

2.2 编译阶段

2.3 汇编阶段

2.4 链接阶段

三、动静态库简介

四、动静态库的优缺点


一、gcc/g++的介绍

首先,先简单的介绍一下gcc/g++。

       GCC(GNU Compiler Collection)是一个由GNU项目开发的编译器集合,它能够编译多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。GCC被广泛应用于各种操作系统和平台上,并且支持多种处理器架构。
       其中,g++是GCC的C++编译器前端,它专门用于编译C++代码。g++在GCC的基础上增加了对C++语言的支持,包括对C++标准库的支持、C++特有的语法和特性等。使用g++可以将C++源代码编译成可执行文件或者库文件。
       总的来说,GCC是一个通用的编译器集合,而g++是其中用于编译C++代码的一个组件。在使用时,可以通过调用gcc或者g++来进行编译,具体取决于需要编译的源代码类型。

简单来说,就是可以用gcc去编译c语言文件,g++去编译c++文件。

       之前我们说过Linux下皆文件,后缀对Linux来说没什么意义,但这并不意味着对Linux上的程序和软件来说没意义,这点需要大家分清楚。

那么,我们要怎么使用gcc/g++呢?(这里用gcc举例,假设有一个文件名叫code.c)

gcc code.c  (正常编译,然后系统会产生一个a.out的可执行文件)

gcc code.c -o myfile.exe (将编译的结果放如myfile.exe文件中,如果没有就创建)

如要执行一个可执行文件,   ./  加文件名就可以了,. 表示当前目录下 , / 表示执行。

这里还给大家列举一些gcc/g++会使用到的一些选项:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高-w 不生成任何警告信息。
  • -Wall 生成所有警告信息。

二、一个程序的翻译过程

2.1 预处理阶段

预处理主要干以下几件事:

  • 头文件展开
  • 去注释
  • 条件编译
  • 宏替换

那我们要怎么验证这个阶段呢?
我们可以通过gcc去看,代码如下:

gcc -E code.c -o code.i
(选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程)

通过运行这行指令,我们得到了一个code.i 文件,接下来我们可以通过vim查看一下。

不难发现,我们的头文件展开了,注释也去掉了,大家可以自行尝试观察一下。

2.2 编译阶段

编译阶段的主要工作:
将我们的代码翻译成汇编指令。

我们同样可以通过Linux的指令来查看这个过程,指令如下:

gcc -S code.i -o code.s 

(“-S”选项用来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。为什么这里用code.i 而不是code.c,其实两个都可以,只是用code.c的话要重新进行预处理,code.i直接就能用)

 同样,通过运行这段指令,生成了一个code.s的文件,我们可以同样使用vim进行查看。

可以发现,原来的c语言代码全都被替换成了汇编代码。

2.3 汇编阶段

汇编阶段的主要任务就是:
将汇编代码转换成可进行重定位的二进制文件。

这也可以通过Linux指令去查看这个过程,代码如下:

gcc -c code.s -o code.o

(使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了)

如果这个时候我们通过vim指令进行查看code.o文件,会看到一堆乱码。

不过我们可以通过od指令查看二进制文件

2.4 链接阶段

链接阶段的主要任务就是:
形成可执行文件。

简单来说,就是所有的.o文件+系统库=可执行文件。

三、动静态库简介

       在我们写程序的时候,我们会发现我们明明没有实现输出的功能,却可以用printf这个函数将想要的内容打印到显示器上。
       这是因为我们使用这个函数是有前提的,我们需要包含一个stdio.h的头文件,这其实就是我们的前辈写好的库,而我们程序如果要用printf这个函数的话,就需要依赖于第三方库。
       在Linux中,我们可以使用相关指令去查看我们引用了哪些第三方库。

       ldd(list dynamic dependencies)是一个用于查看可执行文件或者共享库文件所依赖的动态链接库的命令。它在Linux系统上常被用来检查程序运行时需要的共享库信息。

       使用ldd命令可以列出一个可执行文件或者共享库文件所依赖的动态链接库及其路径,以及这些动态链接库是否能够被找到。这对于调试程序运行时出现的库依赖问题非常有用。

       使用格式:
       ldd + 想要查看的可执行程序

我们这里同样拿上面的例子进行举例:

可以发现我们引用了 libc.so.6 这个库,那他这个库是什么意思呢,我们现在来解读一下。

在这就不得不提到一个概念  动静态库。

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

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

在Linux中,动态库常以  .so 为后缀,静态库常以 .a为后缀。
在Windows中,动态库常以  .dull为后缀,静态库常以 .lib为后缀。

四、动静态库的优缺点

       上面我们已经提到过了动静态库的定义,简单来说,动态库就是根据其提供的地址去调用我们要使用的函数。而静态库则是给你整个代码全搬过来。由此我们来分析其优缺点:

动态库:
优点:形成的可执行程序体积比较小,比较节省资源。
缺点:会稍微慢一点,且程序强依赖于动态库,这个库一旦没了,所有依赖于此库的程序都无法运行了。

静态库:

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

在Linux中,静态库默认是没有安装的,那我们可以通过以下指令来安装

c语言静态库: sudo yum install glibc-static

c++静态库:sudo yum install -y libstdc++-static

同样我们也可以用静态库来运行程序,例如:

gcc code.c -static

运行结果都是一样的,就是用ldd查看库的结果不一样。

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

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

相关文章

MySql安装到配置-超详细版

哈喽宝子们,好久不见,大一五一有没有出去玩呀~反正我是没有出去,就5月1号那天晚上跟室友去看了个电影,然后这几天基本都在宿舍“卷”,其实也不是啦,就是学习学习,因为一方面,暑期实习…

debian10 (armbian) 配置CUPS 服务

更新apt apt-update安装相关软件 apt-get install ghostscript apt-get install dc apt-get install foomatic-db-engine apt-get install cups3.修改配置文件 nano /etc/cups/cupsd.conf Listen localhost:631改为 Listen 0.0.0.0:631 以下四段配置加入Allow All # Only li…

大模型公开可用的模型检查点或 API

文章目录 公开可用的模型检查点或 APILLaMA 变体系列大语言模型的公共 API 公开可用的模型检查点或 API 众所周知,大模型预训练是一项对计算资源要求极高的任务。因此,经过预训练的公开模型检查点(Model Checkpoint)对于推动大语言…

2024牛客五一集训派对day2 Groundhog Looking Dowdy 个人解题思路

前言: 被实验室教练要求要打的这次五一牛客的训练赛,这些区域赛难度的题对于大一的我来说难度实在是太高了,我和我的队友只写了一些非常简单的签到题,其他题目都没怎么看(我们太弱了),但我可以分…

Spring Cloud学习笔记(Hystrix):execute,queue,observe,toObservable样例和特性

这是本人学习的总结,主要学习资料如下 - 马士兵教育 1、Overview2、execute()2.1、Overview2.2、示例 3、queue()3.1、Overview3.2、示例 4、observe()4.1、Overview4.2、示例 5、toObservable()5.1、observe()和toObservable()的区别 1、Overview 我们知道Hystrix…

一文看懂卷积神经网络CNN(1)—前馈神经网络

目录 参考资料 一、神经网络 1、人脑神经网络 2、人工神经网络 3、神经网络的发展历史 二、前馈神经网络 1、神经元 (1)Sigmoid型函数 ① Logistic函数 ②Tanh函数 ③两个函数形状对比 (2)ReLU函数 ① 带泄露的ReLU函…

vue 设置输入框只能输入数字且只能输入小数点后两位,并且不能输入减号

<el-input v-model.trim"sb.price" placeholder"现价" class"input_w3" oninput"valuevalue.replace(/[^0-9.]/g,).replace(/\.{2,}/g,.).replace(/^(\-)*(\d)\.(\d\d).*$/,$1$2.$3)"/> 嘎嘎简单、、、、、、、、、

微软如何打造数字零售力航母系列科普08 - Yobe 如何联手微软Azure,安全使用客户数据,预测客户购买行为?

Yobe 如何联手Azure&#xff0c;安全使用客户数据&#xff0c;预测客户购买行为&#xff1f; 在当今数据驱动的世界中&#xff0c;了解客户行为并有能力通过数据和分析预测客户意图是企业保持竞争力所应具备的首要优势。Yobi由Max Snow、Bill Wise和Tom Griffiths于2019年创立&…

【软考高项】三十一、成本管理4个过程

一、规划成本管理 1、定义、作用 定义&#xff1a;确定如何估算、预算、管理、监督和控制项目成本的过程作用&#xff1a;在整个项目期间为如何管理项目成本提供指南和方向 应该在项目规划阶段的早期就对成本管理工作进行规划&#xff0c;建立各成本管理过程的基本框架&…

题目:极速返航

问题描述&#xff1a; 解题思路&#xff1a; 看到题目要求最大值最小&#xff0c;最小值最大&#xff1a;一眼二分答案。二分的时间复杂度是O(log n)。 二分枚举可能的答案X。check()函数判断合法情况。 AC代码&#xff1a; #include<bits/stdc.h> using namespace std…

算法课程笔记——蓝桥云课第六次直播

&#xff08;只有一个数&#xff0c;或者因子只有一个&#xff09;先自己打表&#xff0c;找找规律函数就是2的n次方 异或前缀和 相等就抵消 先前缀和再二分

OpenCV(一) —— OpenCV 基础

1、OpenCV 简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个基于 BSD 许可开源发行的跨平台的计算机视觉库。可用于开发实时的图像处理、计算机视觉以及模式识别程序。由英特尔公司发起并参与开发&#xff0c;以 BSD 许可证授权发行&#xff0c…

【深度学习】位置编码

一、引言 Self-Attention并行的计算方式未考虑输入特征间的位置关系&#xff0c;这对NLP来说是不可接受的&#xff0c;毕竟一个句子中每个单词都有着明显的顺序关系。Transformer没有RNN、LSTM那样的顺序结构&#xff0c;所以Transformer在提出Self-Attention的同时提出了Posi…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

STM32 F103C8T6学习笔记17:类IIC通信(SMBus协议)—MLX90614红外非接触温度计

今日学习配置MLX90614红外非接触温度计 与 STM32 F103C8T6 单片机的通信 文章提供测试代码讲解、完整工程下载、测试效果图 本文需要用到的大概基础知识&#xff1a;1.3寸OLED配置通信显示、IIC通信、 定时器配置使用 这里就只贴出我的 OLED驱动方面的网址链接了&#xff1a…

QT+串口调试助手+基本版

一、创建串口调试助手UI界面 1、首先生成串口连接必要参数界面&#xff0c;删除关闭串口控件 2、给参数下拉框添加常见的选项&#xff0c;删除关闭串口控件 3、将串口调试助手参数界面布局整齐&#xff0c;删除关闭串口控件 4、更改控件名字&#xff0c;方便后续编程&#xff…

深度学习中权重初始化的重要性

深度学习模型中的权重初始化经常被人忽略&#xff0c;而事实上这是非常重要的一个步骤&#xff0c;模型的初始化权重的好坏关系到模型的训练成功与否&#xff0c;以及训练速度是否快速&#xff0c;效果是否更好等等&#xff0c;这次我们专门来看看深度学习中的权重初始化问题。…

stm32之hal库串口中断和ringbuffer的结合

前言 结合hal库封装的中断处理函数使用rt-thread内部的rt-ringbuffer数据结构源码改造hal库串口部分的源码&#xff0c;将内部静态方法变为弱引用的函数&#xff0c;方便重写标志位采用信号量或变量的两种方式&#xff0c;内部数据分配方式采用动态和静态两种方式 hal库部分串…

qt嵌入并控制外部程序

一、流程 1、调用Window接口模拟鼠标&#xff0c;键盘事件 POINT point; LPPOINT lpppoint &point; GetCursorPos(lpppoint);//获取鼠标位置 SetCursorPos(point.x, point.y);//设置鼠标位置//鼠标左键按下 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, poi…

.单链表.

单链表就是将所要求得的数据呈现在一条链上进行求解。(用一种链式结构存储数据&#xff0c;这种结构就称之为链表) 题目&#xff1a; 实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a; 向链表头插入一个数&#xff1b;删除第 k&#x1d458; 个插…