Linux编译器 gcc与g++

news2025/1/12 20:03:13

Linux编译器 gcc/g++工具

目录

  • Linux编译器 gcc/g++工具
    • 1、程序的诞生
    • 2、gcc工具
      • 2.1 预处理
      • 2.2 编译
      • 2.3 汇编
      • 2.4 链接
      • 2.5 运行
      • 2.6 总结
    • 3、静态链接与动态链接
      • 3.1 静态链接
      • 3.2 动态链接
      • 3.3 Linux下库的命名

1、程序的诞生

程序的编译过程:

1、预处理(头文件包含、消除注释、宏定义替换)

2、编译(将语言替换成汇编代码)

3、汇编(将汇编指令转换为二进制指令)

4、链接(合并段表、符号表合并及重定位)

image-20221107210713530

2、gcc工具

我们可以通过gcc工具实现程序的编译过程:

image-20230407125530236

2.1 预处理

预处理会完成:①头文件包含,②define定义符号的替换和删除定义的符号,③删除注释

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -E:该选项的作用是让gcc在预处理结束后停止编译过程;
  • -o:指明生成的目标文件

使用gcc进行预处理:

gcc -E Test.c -o Test.i

这里预处理程序Test.c,生成预处理后的文件并命名为Test.i;由于Linux文件类型与后缀无关,因此这里命名文件后缀名是为了方便用户明确其文件类型

image-20230407122236655

2.2 编译

gcc首先要检查代码的规范性,是否有语法错误等,然后把C语言代码转换成汇编代码

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -S:只进行编译而不进行汇编,生成汇编代码。
  • -o:指明生成的目标文件

使用gcc对已经预处理的文件进行汇编:

gcc -S Test.i -o Test.s

image-20230407122926739

2.3 汇编

在汇编阶段会把汇编代码转换成二进制指令,同时会形成符号表

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -c:汇编代码转化为.o的二进制目标代码
  • -o:指明生成的目标文件

使用gcc对已经完成编译的文件进行汇编:

gcc -c Test.s -o Test.o

image-20230407124633905

我们使用vim编辑器查看Test.o文件:

vim Test.o

image-20230407124109103

可以看到已经将汇编文件转化为二进制代码了,我们已经看不懂了

2.4 链接

链接的作用是将汇编完成后的二进制文件生成可执行文件

语法:

gcc [文件名] [选项] [生成文件名]

默认情况生成a.out,可以使用-o选项指明生成的目标文件:

gcc Test.o -o test 

image-20230407124843434

也可以直接默认生成:

gcc Test.o

image-20230407124739250

2.5 运行

当我们完成预处理—>编译—>汇编—>链接步骤后得到了我们的可执行文件,此时我们通过./来运行该可执行文件即可:

./a.out
./Test.exe

image-20230407125053077

2.6 总结

以上我们通过gcc工具,通过四个步骤最终实现了程序的编译过程,最终得到可执行文件:

image-20230407130132762

其中选项含义:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面;
  • -S 编译到汇编语言不进行汇编和链接;
  • -c 编译到目标代码;
  • -o 文件输出到文件;

👉 以上四个步骤我们可以通过gcc一步完成:

gcc hello.c                  #直接生成可执行文件

默认生成a.out可执行文件,也可通过-o选项重新命名:

gcc hello.c -o hello.exe     #将可执行文件命名为hello.exe

image-20230407130445493

3、静态链接与动态链接

例如当我们使用printf函数时,是直接使用的库函数,库函数的代码在库文件中,因此库文件在何时,以怎样的方式加入到我们的程序当中的呢?下面我们将探讨这个问题。

3.1 静态链接

静态链接是指在编译链接时,把库文件的代码全部加入到可执行文件中;因此生成的文件比较大,但在运行时也就不再需要库文件了一定程度上提高了执行速度。静态链接链接静态库,其后缀一般为.a

优势:不受库升级或者被删除的影响;
劣势:形成的可执行程序体积太大,浪费资源(可能在网络、磁盘、内存上占用了很大的资源)。

3.2 动态链接

动态链接与静态相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库文件。动态链接链接动态库,其后缀一般为.so。

优势:形成的可执行程序体积小,很好地节省资源(网络、磁盘、内存);
劣势:受库升级或者被删除的影响

例如我们以hello world程序为例:

gcc hello.c -o hello       #编译程序
file hello                 #查看该可执行程序

image-20230407134353193

即:dynamically linked

可知Linux下使用的是动态链接!

ldd hello                  #查看动态链接库

image-20230407134614131

3.3 Linux下库的命名

动态库:

libxxxxx.so 去掉前缀lib,去掉后缀.so,剩下的即是该库名

例如刚刚我们查看的静态链接库:

静态库:

libyyyyy.a 去掉前缀lib,去掉后缀.a,剩下的即是该库名

需要注意的是,Linux下静态链接需要使用静态库,而操作系统中可能没有对应的静态库,需要下载:

sudo yum install -y glibc-static         #下载C标准静态库
sudo yum install -y libstdc++-static     #下载C++标准静态库 
sudo yum install -y gcc-c++              #下载g++

由于Linux下链接步骤默认为动态链接,因此在下载完静态库后我们可以通过-static指令实现静态链接:

gcc hello.c -o hello_static -static

image-20230407135917544

可以看到同一个程序通过动态链接和静态链接形成的可执行文件体积大小差别极大(100倍)!

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

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

相关文章

算法导论 | 算法在计算中的作用

第一章 | 算法在计算中的作用 笔记 什么是算法? 算法就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出不正确的算法只要其错误率可控有时可能是有用的算法的说明的唯一要求是这个说明必须精确描述所要遵循的…

datax 从oracle迁移到es中

任务启动时刻 : 2023-04-20 19:34:56 任务结束时刻 : 2023-04-20 19:56:22 任务总计耗时 : 1285s 任务平均流量 : 5.07MB/s 记录写入速度 : …

离散型制造企业如何选择MES系统

随着MES系统越来越被企业所重视,并并被运用到很多不同行业的制造业中。 MES对于制造企业来说,其所需要的要求是各不相同的,比如离散型制造企业,该如何去选择MES系统呢? 什么是离散型制造企业? 离散型制造企…

nn.init.xavier_uniform_()的作用:根据均匀分布生成Tensor

官网解释如下: Signature: nn.init.xavier_uniform_(tensor: torch.Tensor, gain: float 1.0) -> torch.Tensor Docstring: Fills the input Tensor with values according to the method described in Understanding the difficulty of training deep feedforw…

PHP语言开发的医院不良事件上报系统源码,前后端分离,仓储模式

医院安全(不良)事件上报系统源码 系统定义: 规范医院安全(不良)事件的主动报告,增强风险防范意识,及时发现医院不良事件和安全隐患,将获取的医院安全信息进行分析反馈,…

STM32开发(十五)STM32F103 片内资源 —— 通用定时器 PWN 无源蜂鸣器 详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示 一、基础知识点 本实验通过STM32F103 的通用定时器 PWN功能,实现对无源蜂鸣器控制。 本实验内容知识点: 1、通用定时器 PWN 详解 2、有源蜂鸣器和无源蜂鸣器…

当我开始学习人工智能:知识表示方法

加油加油,五一前复习玩,五一就可以出去玩啦 一、状态空间法(State Space Representation) 问题求解技术主要是两个方面 问题的表示求解的方法 状态空间法 状态算符状态空间方法 1.1 问题状态描述 定义 状态:描述某类不…

电感耦合等离子体原子发射光谱法(ICP-AES)

一、定义 电感耦合等离子体原子发射光谱法(ICP-AES),是以电感耦合等离子矩为激发光源的光谱分析方法,具有准确度高和精密度高、检出限低、测定快速、线性范围宽、可同时测定多种元素等优点,国外已广泛用于环境样品及岩石、矿物、金属等样品中…

SimpleDateFormat模式字符串格式

SimpleDateFormat模式字符串 new SimpleDateFormat(String parm); parm为一个字符串,表示格式. 时间模式 字母 时间元素 表示 示例 y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 D 年中的天数 Number 200 d 月份中的天数 Number 31;30;28;29 H 一天中的小时(24小时…

【MySQL】表的基本操作

1、数据类型 1.1 数值类型 数据类型大小说明bit[(M)]M指定位数,默认为1二进制,M范围从1到64,存储数值范围从0到2^M-1tinyint1字节smallint2字节int4字节bigint8字节float(M,D)4字节单精度,M指定长度,D 指定小数位数&am…

Peach Fuzzer漏洞挖掘实战

概述 本文主要介绍模糊测试技术,开源模糊测试框架Peach Fuzzer,最后使用Peach Fuzzer对Modbus Slave软件进行漏洞挖掘,并成功挖掘到0DAY漏洞。(文中涉及的漏洞已提交到国家漏洞库,现已修复) 模糊测试技术 模…

电影《绿皮书》鉴赏

**《绿皮书》**由彼得法雷尔执导,维戈莫滕森和马萨拉阿里主演,改编自关于保镖托尼的真实故事。20世纪60年代,美国的种族关系紧张,黑人音乐家很少有机会演出。作为当时为数不多的黑人钢琴家之一,唐参加了许多音乐会巡演…

[chapter27][PyTorch][visdom]

前言: Visdom是Facebook专为PyTorch开发的实时可视化工具包,相当于TensorFlow中的Tensorboard,灵活高效且界面美观。 目录: 1: 环境安装 2: 参数简介 3: 监听单一数据 4: 监听多个数…

晶振电路并联一个电阻作用

晶振电路并联一个电阻的作用 前言 在设计电路时,通常看到一些主控的外部高速晶振并联了一个1MΩ的电阻,但是发现有的电路不用也可以正常工作,对这个就有点好奇啦? 电路图如下: 实际上晶振电路在工作时没有并联一个1…

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码

如何使用Sublime来规范化代码的格式,让代码更加规范整齐,批量修改代码 设备/引擎:Mac(11.7)/cocos 开发工具:Sublime Text 开发语言:c/java 代码开发中经常需要将代码进行规范化处理&#x…

PHP +python+nodejs+springboot+vue 校园电子资料资源管理系统

能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实现信息化,无纸化…

js录音支持h5 pc ios android

最近在做h5录音的页面要求可暂停录音,继续录音,写好后发现不兼容ios,无奈只能找兼容方法,找了一天也没找到,后来看到一个网站在ios上可以暂停录音,后来引入他的js文件果然能用了 网站放下面了 Recorder H5: 用于html5网页中的前…

ASP.NET ZERO Crack坚实的体系结构

ASP.NET ZERO Crack坚实的体系结构 据说ASP.NET ZERO是互联网应用程序新流程的起点,该流程包含现代用户界面,具有强大的体系结构和完整的源代码。它可以通过提供共享的应用程序来节省用户时间,这些应用程序是visual studio预构建解决方案所必…

PostMan笔记(一)简介+安装和设置

1. PostMan简介 Postman 是一款功能强大的 API 开发工具,支持多种 HTTP 请求方法和测试断言,能够快速调试和测试 API 接口,提高开发效率。本文将介绍 Postman 工具的使用方法。 安装和设置 首先,需要下载和安装 Postman 工具。…

[ChatGPT]-02-ChatGPT对安全的影响和开源的LLM大模型资源汇总

文章目录 0.ChatGPT大模型带来的影响0.1 ChatGPT带来信息化革命性创新,目前尚不能处理专业知识但成长很快0.2 Chat GPT为网安行业带来新的创新方向,也将引领新一轮投融资热潮0.2.1 攻击方发起网络攻击的门槛降低0.2.2 防守方合理使用ChatGPT可大幅减少安…