【Linux】Linux编辑器-gcc/g++使用

news2024/12/24 11:05:27

目录

一、背景知识

二、gcc是如何完成的

  1、预处理(进行宏替换)

  2、编译(生成汇编)

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

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

     4.1、静态库

     4.2、动态库

     4.3、动静态库的比较 

三、gcc常见的选项

 


一、背景知识

计算机是二进制读取文件的,我们写好代码是经过编译,链接,然后形成可执行程序。
1、预处理(进行宏替换);
2、 编译(生成汇编) ;

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

4、连接(生成可执行文件或库文件) .

二、gcc是如何完成的

  1、预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例: gcc –E hello.c –o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

如下是Linux运行结果:

并且生成如下的test.i的文件,

可以看出在test.i文件中的注释已经去掉,宏已经被替换了。 

  2、编译(生成汇编)

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

此时又生成一个test.s的文件,

虽然看的不太懂,但是我们经过前段时间的学习,大概能够看出这是汇编代码。

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

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

此时已经将汇编代码转换成了“.o”的二进制目标代码了。

注意:此时还没有进行链接,所以是不可执行的。

 

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

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

链接之后生成了可执行文件,此时就可以运行了。

链接:

  • 静态链接:编译器的链接器此时会将我们的程序以静态链接的形式与静态库进行链接。
  • 动态链接:编译器的链接器此时会将我们的程序以动态链接的形式与动态库进行连接。

执行 ldd + test 命令可以看出是静态链接还是动态链接 。

可以看出是动态链接。Linux下:动态库是以.so结尾的,静态库是以.a结尾的。

下面接着介绍一下动静态库:

     4.1、静态库

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”
  • 实例:gcc test.c -o test-static -static

可以看出静态链接和动态链接的文件大小差距还是很大的,静态链接生成的文件比较占用空间。

静态库的命名为:libXXX.a

  • lib 是前缀
  • .a 是后缀
  • XXX 是真正的库

通过file 命令可以查看详细信息

静态链接 : 因为是直接将需要的代码拷贝到程序中,因此最终生成的文件会变大,比较占空间。 

     4.2、动态库

  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello;
  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。

静态库的命名为:libXXX.so

  • lib 是前缀
  • .so 是后缀
  • XXX 是真正的库

动态链接 :主要依赖不同函数在库中的位置信息进行调用,只有一份代码库,比较节省空间。

    4.3、动静态库的比较 

静态库:

    优点:(1)所需函数直接拷贝至程序中,运行速度快;(2)程序运行不依赖库,便于移植。

    缺点:(1)如果将函数进行修改,需要重新进行编译;(2)同一份代码可能出现重复拷贝的情况,浪费空间。

动态库:

    优点:(1)可以实现不同进程间的资源共享;(2)对于函数的修改只需要替换动态库文件即可,不需要重新编译程序。

    缺点:(1)需要调用函数,运行速度较慢;(2)程序运行需要依赖动态库。

三、gcc常见的选项

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

 


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

 

老铁们,记着点赞加关注!!! 

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

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

相关文章

HHDBCS及HHDESK的资源加密功能

安全性,是头等重要的事情。HHDBCS及HHDESK均有一项实用功能,资源加密。 HHDBCS 打开HHDBCS,出现连接管理界面(或者在运行过程中,点击连接管理),点击如下图箭头所指处的图标即可 HHDESK 点击主…

全球范围内的数字化时代,挑战和价值有哪些?

近年来,数字经济的发展趋势越来越明显,尤其是随着疫情的影响,加速了传统产业向数字化、网络化和智能化产业的转型和升级。全球数字经济规模不断扩大,体量连年增长,根据中国信息通信研究院报告显示,2019年全…

VMware虚拟机,匹配库中的文件系统文件夹层次结构

不需要把虚拟机文件复制到本地就不需要勾选“匹配库中的文件系统文件夹层次结构”这个选项。 但是,即便是勾选“匹配库中的文件系统文件夹层次结构”这一选项,也可以不勾选下一个选项卡的任何选项。

Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

🚀 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数&…

Python源码怎么运行?

要运行Python源码,您需要安装Python解释器。Python解释器是一种软件,它可以读取Python源代码并将其转换为计算机可以理解和执行的指令。 在Windows操作系统上运行Python源代码的步骤: 在您的计算机上下载并安装Python解释器。您可以从Pyth…

COM接口规则的存在是有原因的

可能有些人认为接口上的 COM 接口规则没有必要设计的那么严格,但我想说的是,这些规则的存在是有原因的。 假设你在你的产品代码中新增加了版本号为 N 的接口,由于这个接口是内部使用的,没有任何公开文档。所以你可以随意修改它&a…

Sentinel 热点参数限流

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如: 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数,针对一段时间…

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料

Prompt工程师指南[资料整合篇]:Prompt最新前沿论文整理合集、工具和库推荐、数据集整合、推荐阅读内容等,超全面资料 1.论文合集 The following are the latest papers (sorted by release date) on prompt engineering. We update this on a daily bas…

Ozeki VOIP SIP SDK 10.3.199 Crack

Ozeki VOIP SIP SDK 使用Ozeki VoIP SIP SDK,您有机会制作自己的VoIP产品,例如软电话,甚至您自己的PBX。 Ozeki VoIP SIP SDK介绍 Ozeki VoIP SIP SDK 是一个软件开发工具包,允许您使用 SIP 协议进行 VoIP 呼叫。它可以很容易地…

LNMP平台对接redis服务

LNMP见我2023-04-17 10:51:16 发布的企业网站架构部署与优化 LNMP https://blog.csdn.net/Richard_Sniper/article/details/130158518?spm1001.2014.3001.5501 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网:http://redis.io/ 下载包&am…

解读直接RF采样架构及优势

多年来,数字收发机被应用在多种类型的应用中,包括地面蜂窝网络、卫星通信和基于雷达的监视、地球观测和监控。过去,收发机的系统工程师在这些应用中使用中频架构。现在,高速数据转换器的最新发展,使新型基于射频直接采…

gif怎么转换成mp4格式?

gif怎么转换成mp4格式?GIF动态图片是一种常见的图片文件,平时我们聊天时会使用到表情包、广告宣传场景也会使用到gif动图,而MP4则是目前广泛应用的视频格式,相信大家都知道这一点。将GIF图片转换为视频格式是一种非常实用的方法。…

SpringCloud实用篇02

文章目录 SpringCloud实用篇020.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置3&#xff09…

选择无论文答辩硕士,那只能选择免联考双证中国人民大学与加拿大女王大学金融硕士

硕士的论文和答辩是一种检验硕士阶段的学习研究成果的一种方式,通过答辩可以让老师清楚的了解论文的价值所在。但从选题背景、研究意义到研究思路、理论基础、研究方法再到关键技术点、实践难点等等,这一个复杂的过程让很多考生在最后这一关被淘汰出局。…

咚咚咚,穷人版生产力工具,好用到飞起

每个程序员都有自己的生产力工具,不管你是深耕职场多年的老鸟,还是在学校努力学习的小鸟,应该都有自己囊里私藏的好辅助。比如帮你完成从头脑风暴草图到创建线框图/原型的UI工具,让代码规范和交付更为可靠的版本控制工具等等。 今…

23种设计模式的必备结构图

这里总结了23种设计模式的结构图及定义,样例代码在 Github:studeyang/design-pattern。 一、创建型模式 1.1 简单工厂模式 1.2 工厂方法模式 工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一…

metaRTC6.0 janus推流操作指南

概要 Janus 是一个非常有名的 WebRTC 流媒体服务器,它是以 Linux 风格编写的服务程序,采用 C 语言实现,Janus 提供插件机制来支持不同的业务逻辑,配合官方自带插件就可以用来实现高效的webRTC Server服务。 metaRTC6.0新版本支持向janus推流…

【国内某组态软件和plc的通信漏洞挖掘】

因为已从原单位离职,复现的环境也已经丢失,再加上也没怎么提交过漏洞,导致上传cnvd失败,故发在此处,万一有用的话,有缘人可自行提交漏洞库。 (一) 环境 组态软件IP地址&#xff1a…

freemark模板导出word-01-简单文本内容

在一些项目中,会遇到导出固定格式的word文档,这个时候我们可以使用模板freemarker来实现,本文先分享简单的字符串填充。 比如现在有一个word模板的样式如下 我们填充好内容后(重点坑点:先采用记事本类似的将${A1}编辑好&#xff…

简易画笔效果

使用代码创建纯白图片,图片大小要与image组件大小相同 使用OnDrag触摸的时候将触摸点周围的像素都改为透明 使用shader判断两张图,只要有一张图像素点透明的地方就都透明 shader代码 Shader "Hidden/Draw" {Properties{_MainTex ("Textu…