Linux编译器---gcc/g++使用详解

目录

前言

 gcc/g++介绍

gcc/g++的编译指令(以gcc为例)

​编辑 gcc选项

预处理(进行宏替换)

 编译(生成汇编)

汇编(生成机器可识别代码)

 链接(生成可执行文件或库文件)

 函数库

概念

 动态库和静态库



 

⭐前言

编译器的处理过程:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件或库文件)
     

更加详细的介绍,可以参照这篇博客:C语言翻译环境:预编译+编译+汇编+链接详解-CSDN博客

 ⭐gcc/g++介绍

GCC(GNU Compiler Collection)是一个由GNU项目开发的编译器套件,它包括了用于多种编程语言的编译器,如C、C++、Fortran、Ada、Go等。GCC是一个开源的工具集,可在多个平台上运行,支持多种操作系统和架构。它是许多操作系统的默认编译器,也是许多开源项目的首选编译工具。

在GCC中,gcc和g++分别是用于编译C和C++代码的编译器。

  1. gcc:

    • 功能gcc是GCC套件中用于编译C语言代码的编译器。它将C源代码编译成目标代码,并调用GCC的后端来生成可执行文件或库文件。
    • 特点:gcc支持多种C语言标准,如ANSI C(C89/C90)、C99和C11。开发人员可以使用gcc来编译符合不同C语言标准的代码,并生成与目标平台兼容的可执行文件。
    • 选项:gcc提供了丰富的编译选项和优化选项,开发人员可以通过这些选项来控制编译过程中的各种行为,如优化级别、调试信息、警告设置等。
  2. g++:

    • 功能g++是GCC套件中用于编译C++代码的编译器。它是gcc的C++编译器前端,通过调用GCC的后端来生成目标代码。
    • 特点:g++支持多种C++标准,如C++98、C++11、C++14、C++17等。开发人员可以使用g++来编译符合不同C++标准的代码,并生成高效的可执行文件或库文件。
    • 选项:与gcc类似,g++也提供了丰富的编译选项和优化选项,可以帮助开发人员优化编译过程并生成高效的目标代码。

除了编译器之外,GCC还包括了一些其他工具,如预处理器、汇编器、链接器等,可以帮助开发人员完成整个编译过程。

⭐gcc/g++的编译指令(以gcc为例)

首先可以查看一下自己的Linux上gcc的版本,确认是否有gcc编译器。

gcc --version

 ⚡gcc选项

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

⚡预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令可以让编译器进行完预处理过程后,就停止,生成目标文件。
  • 实例: gcc -E test.c -o test.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,-o filename 可以指定生成的可执行文件的名称,“.i”文件为已经过预处理的C原始程序。

 ⚡编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用 “-S” 选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
  • 实例: gcc -S test.i -o test.s

⚡汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  • 实例: gcc -c test.s -o test.o

 ⚡链接(生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段。
  • 实例: gcc test.o -o test.exe

 上述的四个指令,实际上在使用时都被压缩成了一条指令,直接编译:

gcc test.c -o test

 ⭐函数库

⚡概念

函数库(Library)是一种预先编写好的、可重用的代码集合,其中包含了一系列函数、类或其他程序组件,用于执行特定的任务或提供特定的功能。函数库通常以文件或模块的形式存在,可以在程序中引用和调用其中的函数来完成相应的操作。

比如我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那我们为什么可以使用这个函数呢?

实际上,系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

 ⚡动态库和静态库

  1. 静态库(Static Library)

    • 静态库在编译时被链接到可执行文件中,编译后的可执行文件包含了静态库中的代码。
    • 每个使用了静态库的可执行文件都会包含一份静态库的副本,因此可执行文件体积较大。
    • 静态库的代码在编译时被复制到可执行文件中,程序运行时不需要外部库文件
    • 静态库的文件扩展名通常为.lib(Windows)或.a(Unix/Linux)。
  2. 动态库(Dynamic Library)

    • 动态库在程序运行时才加载到内存中,可执行文件只包含对动态库的引用。
    • 多个程序可以共享一份动态库,减少内存占用和磁盘空间
    • 动态库的代码在程序运行时动态加载,可能会造成一定的性能损失。
    • 动态库的文件扩展名通常为.dll(Windows)或.so(Unix/Linux)

gcc的默认链接方式是链接动态库,我们可以手动修改为链接静态库:

gcc -static test.c -o test-static

可以发现通过链接静态库生成的可执行程序的大小远远大于通过链接动态库生成的可执行程序的大小。

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

file+filename//查看文件类型

____________________

⭐感谢你的阅读,希望本文能够对你有所帮助。如果你喜欢我的内容,记得点赞关注收藏我的博客,我会继续分享更多的内容。⭐

 

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

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

相关文章

基于SSH打通隧道实现异地组网

前言 最近有异地组网的需求,我目前的是用蒲公英X1盒子来进行组网,但是蒲公英X1非会员账号有设备限制3个(这个是硬伤),虽然说可以打通P2P但是在复杂的网络环境下概率不是特别高 所以研究下SSH异地组网的方式&#xff…

超级实用的python代码片段汇总和详细解析(16个)

目录 1. 生成随机文本 2. 计算文本文件中的字数 3. 替换文件文件中的字串 4. 多文件名的批量替换 5. 从网站提取数据 6. 批量下载图片 7.批量删除空文件夹 8.Excel表格读写 9.合并Excel表格工作簿 10.数据库SQL查询 11. 系统进程查杀 12.图像尺寸调整和裁剪 13.图…

【Java EE初阶二十】http的简单理解(一)

1. 初识http HTTP 最新的版本应该是 HTTP/3.0,目前大规模使用的版本 HTTP/1.1; 下面来简单说明一下使用 HTTP 协议的场景: 1、浏览器打开网站 (基本上) 2、手机 APP 访问对应的服务器 (大概率) 前面的 TCP与UDP 和http不同,HTTP 的报文格式&a…

信钰证券:A股逼空七连阳后何去何从?3000点会不会成为新起点

沪指豪取七连阳,创三年半以来最长连涨纪录。 A股三大股指2月22日开盘涨跌互现。早盘指数分解,沪强深弱格局再现,创指始终保持颓势。午后指数继续分解,但尾盘三大股指携手上涨。 关于此轮上涨,方正证券剖析师赵伟强调…

【开源】SpringBoot框架开发音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台,包含了音乐…

Shopee加载图片很慢怎么办?Shopee图片优化的重要性?站斧浏览器

Shopee加载图片很慢怎么办? 加载图片过慢不仅影响用户体验,还可能导致顾客流失。以下是一些解决策略: 优化图片大小:在保证图片质量的前提下,尽量减小图片的文件大小。这可以通过调整图片尺寸、压缩图片质量或使用适…

EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比

EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-GRU-MATT、TCN-GRU、TCN、GRU多变量时间…

Redis突现拒绝连接问题处理总结

一、问题回顾 项目突然报异常 [INFO] 2024-02-20 10:09:43.116 i.l.core.protocol.ConnectionWatchdog [171]: Reconnecting, last destination was 192.168.0.231:6379 [WARN] 2024-02-20 10:09:43.120 i.l.core.protocol.ConnectionWatchdog [151]: Cannot reconnect…

层级关联,审批人功能

一个需求要求选择一级&#xff0c;下方展示一级的效果 后端给了审批人数据&#xff0c;但是数据需要单独处理 <template><div class"box"><el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"…

基于java+springboot+vue实现的美食信息推荐系统(文末源码+Lw)23-170

1 摘 要 使用旧方法对美食信息推荐系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在美食信息推荐系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发…

mapbox面图层标注

mapbox并没有一个属性类似于’text-field’的symbol图层的直接可以标注的办法&#xff0c;这里笔者提供两种其他的面图层标注的办法用来大家参考 贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家。 效果图 方案一 把面图层当做点图层直接展示 在mapbox里面&#x…

Django后端开发——ORM

文章目录 参考资料ORM-基础字段及选项字段类型练习——添加模型类应用bookstore下的models.py数据库迁移——同步至mysqlmysql中查看效果字段选项Meta类定义示例:改表名应用bookstore下的models.py终端效果练习——改表名+字段选项修改应用bookstore下的models.py终端效果ORM基…

超市售货|超市售货管理小程序|基于微信小程序的超市售货管理系统设计与实现(源码+数据库+文档)

超市售货管理小程序目录 目录 基于微信小程序的超市售货管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;商品管理 &#xff08;2&#xff09;出入库管理 &#xff08;3&#xff09;公告管理 …

研发流程图

1、需求评审流程 2、用例评审流程 3、代码评审流程 4、产品功能上线流程

GaussDB SQL调优:建立合适的索引

背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数据库…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 &#xff08;以上可以自行网上查阅资料&#xff09; 开始实现 1.注册讯飞星火用户&#xff0c;获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…

【学习iOS高质量开发】——协议与分类

文章目录 一、通过委托与数据源协议进行对象间通信1.委托模式2.要点 二、将类的实现代码分散到便于管理的数个分类之中1.如何实现2.要点 三、总是为第三方类的分类名称加前缀1.为什么总是为第三方类的分类名称加前缀2.要点 三、勿在分类中声明属性1.勿在分类中声明属性的原因2.…

先进语言模型带来的变革与潜力

用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动&#xff0c;开启通往知识宝库的大门&#xff0c;即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型&#xff0c;能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能&#xff1a; 搜需路径&#xff1a;是含一串路径的字符串&#xff0c;各路径之间以特殊字符&#xff08;如冒号或分号&#xff09;分隔&#xff0c;找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

PHP小程序 获取二维码

//获取token public function getAccessToken($appId,$appSecret) {// 请求API获取 access_token$url "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid{$this->appId}&secret{$this->appSecret}";$result $this->g…