Linux -- 认识gcc/g++、代码的编译过程

目录

前言:

使用 gcc/g++:

代码的编译过程: 

预处理:

头文件展开:

宏替换+去注释: 

​编辑

条件编译: 

编译:

汇编:

链接:

动态库(动态链接):

静态库(静态链接):


前言:

我们写完一段源代码后,需要让代码跑起来,在Linux中,我们使用 gcc/g++来编译C语言/C++代码。

使用 gcc/g++:

我们现在新建了一个文件,且代码如下:

 gcc  [ 源代码文件名 ] 就可以对指定的代码文件进行编译,编译时会生成一个可执行程序,如果没有为可执行程序命名,默认文件名为 a.out,运行 a.out ,就会运行我们所写的代码!

我们也可以为可执行程序命名,gcc  [ 源代码文件名 ]  -o   [ 可执行程序文件名 ]

-o 后接目标文件

g++ 的使用方法和 gcc 相同,这里不再赘述。

需要区别的是,gcc只能编译 C语言 ,g++可以编译 C语言 和 C++!

代码的编译过程: 

预处理:

预处理时,会对代码进行宏替换、去掉注释、条件编译、头文件展开,如果想查看预处理后的代码,以 gcc 为例:gcc  -E  test.c  -o  test.i ,就可以把预处理后的代码存放到指定的文件中,注意,目标文件后缀为 .i 。

-E 表示从现在开始进行程序的预处理过程,当预处理工作结束后,就停下来,不再进行后续的工作! 

头文件展开:

虽然我们原来的代码只有15行,经过头文件展开后,代码行数已经达到851行!

宏替换+去注释: 

如果代码中有注释和宏定义,预处理时,会进行宏替换和删除注释,通过下面的对比可以看出: 

条件编译: 

由于宏定义时只定义了VERSION1,在条件编译时,只有VERSION1的代码保留下来,其余未定义的全部被动态裁剪了!若只定义了VERSION2,或者没有宏定义,也同理!

可以看出,预处理时,可以对代码进行编辑和裁剪。

我们也可以在预处理的指令中进行宏定义, 即使在源代码中我们没有定义 VERSION1,但我们在指令中定义了,效果和在源代码中定义相同!

指令: gcc -E  test.c  -o  test.i  -D  VERSION1=1

条件编译可以防止头文件重复包含!头文件重复包含,会导致头文件展开时,代码量太大,导致编译效率低下!我们需要规避头文件重复包含!这是个好的编程习惯。  

#ifndef _NAME_H
#define _NAME_H
//头文件内容
#endif

这里的 _NAME_H 可以是自定义的宏,这里的宏应为独一无二的,不可以与文件中的其他宏的名字相同!

# ifndef _NAME_H (if not define _NAME_H )

1、如果宏_NAME_H未定义,那么就会走 #define _NAME_H 语句,定义宏 _NAME_H,并且引入头文件

2、如果宏_NAME_H已经定义了,则不会走 #define _NAME_H 语句,直接进入#endif,不引入头文件

编译:

编译时,把代码转为汇编语言

-S:从现在开始进行程序的编译,当编译工作完成,就停下来!

形成汇编文件,可以直接在预处理的文件上进行编译,也可以直接在源代码上进行编译,即两种写法:gcc  -S  test.c  -o  test.s  (在源代码上)或 gcc  -S  test.i  -o  test.s(在预处理后的文件上)。

汇编:

汇编时,把编译后生成的汇编语言转为二进制语言

-c :从现在开始进行程序的汇编,汇编工作结束后,就停下来!

同样可以在源代码的基础上进行汇编,也可以在编译文件上进行汇编! 

 转为二进制后,代码还不可以运行起来,即使开放了可执行权限,也是运行不起来的!

还需要最后一步--链接! 

链接:

直接 gcc test.o  -o  test 就可以进行链接,所谓链接,就是把代码和库文件进行链接,默认与动态库进行链接

 ldd 可以查看代码和动态库还是静态库产生链接

在 Linux 中,动态库以 .so 结尾,静态库以 .a 结尾;

在Windows中,动态库以 .dll 结尾,静态库以 .lib 结尾。 

动态库(动态链接):

动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入

程序运行时,如果我们需要调用 printf 函数, printf 函数会被修改为库函数中 printf 实现的地址,这时候动态链接就建立好了。

动态库也叫共享库。

优点:比较节省资源(内存资源、网络资源等),不会出现太多的重复的代码;

缺点:对库的依赖性比较强,一旦库丢失,所有依赖该库的程序都无法运行。

 用 file 命令查看文件类型时,可以看出代码是动态链接的:

静态库(静态链接):

编译链接时,把库文件的代码全部加入到可执行文件中

优点:可执行程序不依赖库,同类型平台中进行跨平台使用;

缺点:生成的文件比较大,比较浪费资源(占用内存--内存资源、网络传输时传输量大--网络资源等)。

代码默认与动态库链接,我们也可以让代码与静态库链接:

gcc -o mybin-static  test.c  -static 就可以让代码与静态库链接,但是系统是默认没有安装静态库的,此时静态链接会出错,我们需要在系统中下载静态库!

在普通用户下,sudo  yum  install  -y  glibc-static  libstdc++-static 就可以安装静态库。 

 安装完成后,用 ldd 和 file 命令可以看出,test-static 与静态库链接。

test 是动态链接的,test-static 是静态链接的,通过对比可以看出, 同样的源代码,静态链接的代码占用的空间比动态链接的大很多。

 

本文到这里就结束了,欢迎各位大佬的指正! 

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

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

相关文章

使用Simulink基于模型设计(二):系统定义和布局

Simulink模型的顶层系统布局是许多工程团队可以使用的公共环境,是基于模型的设计范式:分析、设计、检验和实现。您可以通过确定模型的结构和各个组件来定义顶层系统。然后,您可以将模型按照层次结构进行组织,分别与系统的各个组件…

【鸿蒙学习笔记】交互事件

官方文档:交互事件 目录标题 分类交互事件-触屏交互事件-手势事件单一手势 分类 交互事件-触屏 在组件上按下(Down) , 滑动(Move) , 抬起(up)时触发的回调事件。包括点击事件、触摸事件和拖拽事件 交互事件-手势事件 在手机上点击打开应用 , 长按后拖动应用 , 这…

自动化数据集成的BI工具,为你提供决策洞察力

传统的商业智能(BI)报表系统采用的是“业务提报表需求,IT进行开发”的模式。决策管理者和业务人员提出用报表等来展示经营管理数据的需求;接着IT响应需求,进行需求沟通、数据处理加工、报表开发等主体工作;…

RFID资产管理系统 RFID固定资产管理系统

大多数企业都曾被固定资产管理“难”的问题困扰:账物不符、查询不便、盘点耗时……因此,越来越多的企业选择用资产管理系统,来实现资产智能化管理。 RFID资产管理系统方案是针对大多数企业存在的资产管理痛点,采用RFID技术&#…

uni-app三部曲之三: 路由拦截

1.引言 路由拦截,个人理解就是在页面跳转的时候,增加一级拦截器,实现一些自定义的功能,其中最重要的就是判断跳转的页面是否需要登录后查看,如果需要登录后查看且此时系统并未登录,就需要跳转到登录页&…

Python地震波逆问题解构算法复杂信号分析

🎯要点 🎯时域、时频域以及时间和频率相关联偏振特性分析三种算法 | 🎯时域波参数估计算法 | 🎯机器学习模型波形指纹分析算法 | 🎯色散曲线和频率相关波分析算法 | 🎯动态倾斜校正算法 | 🎯声…

【JS|第21期】JavaScript模块化:深入解析三种文件暴露方式

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

新手小白报考学习PMP会遇到哪些“坑”?

PMP考试的陷阱实际上与其他大型证书考试差不多,主要是在选择培训机构和各种收费方面会遇到一些坑。 首先,并不是每个人都能经历这些坑,因为PMP考试有一定的门槛。 作为引进国外的考试,报名都有中英文之分,所以先来看…

STM32的 DMA(直接存储器访问) 详解

STM32的DMA(Direct Memory Access,直接存储器存取)是一种在单片机中用于高效实现数据传输的技术。它允许外设设备直接访问RAM,不需要CPU的干预,从而释放CPU资源,提高CPU工作效率,本文基于STM32F…

[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_f…

(附源码)c#+winform实现远程开机(广域网可用)

实现逻辑 利用UDP协议发送特定格式的魔术包&#xff0c;以远程唤醒具有特定MAC地址的目标计算机。目标计算机的BIOS和网络配置需要支持Wake-on-LAN&#xff08;WOL&#xff09;功能&#xff0c;并且需要在目标计算机上配置正确的网络唤醒设置。 源码在最后 准备工作 进入Bio…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

Redis管理禁用命令

在redis数据量比较大时&#xff0c;执行 keys * &#xff0c;fluashdb 这些命令&#xff0c;会导致redis长时间阻塞&#xff0c;大量请求被阻塞&#xff0c;cpu飙升&#xff0c;严重可能导致redis宕机&#xff0c;数据库雪崩。所以一些命令在生产环境禁止使用。 Redis 禁用命令…

【C语言】指针(3):探索-不同类型指针变量

目录 一、字符指针变量 二、数组指针变量 三、二维数组传参的本质 四、函数指针变量 4.1 函数指针变量 4.2 函数指针变量的使用 4.3 函数指针变量的拓展 五、函数指针数组 六、转移表的应用 通过深入理解指针&#xff08;1&#xff09;和深入理解指针&#xff08;2&am…

67.SAP FICO-凭证类型学习

目录 SAP凭证类型 凭证类型的作用 - OBA7 SAP默认的凭证类型更改 FI相应事务代码默认凭证类型 - OBU1 对FB50、60、70默认凭证类型的更改 - OBZO 后勤货物移动默认凭证类型 - OMBA 发货凭证类型 收货凭证类型 自动移动凭证类型 存货盘点凭证类型 发票默认的凭证类…

数据结构--二叉树相关习题5(判断二叉树是否是完全二叉树 )

1.判断二叉树是否是完全二叉树 辨别&#xff1a; 不能使用递归或者算节点个数和高度来判断。 满二叉树可以用高度和节点来判断&#xff0c;因为是完整的。 但是完全二叉树前面是满的&#xff0c;但是最后一层是从左到右连续这种 如果仍然用这种方法的话&#xff0c;如下图…

暑期备考2024小学生古诗文大会:吃透真题和知识点(持续)

2024年上海市小学生古诗文大会的自由报名初赛将于10月19日&#xff08;星期六&#xff09;正式开始&#xff0c;还有3个多月的时间。 为帮助孩子们备考&#xff0c;我持续分享往年上海小学生古诗文大会真题&#xff0c;这些题目来自我去重、合并后的1700在线题库&#xff0c;每…

加密与安全_密钥体系的三个核心目标之完整性解决方案

文章目录 Pre机密性完整性1. 哈希函数&#xff08;Hash Function&#xff09;定义特征常见算法应用散列函数常用场景散列函数无法解决的问题 2. 消息认证码&#xff08;MAC&#xff09;概述定义常见算法工作原理如何使用 MACMAC 的问题 不可否认性数字签名&#xff08;Digital …

SketchUp Pro 2024:现代科技之诗意体验

在那遥远的唐朝&#xff0c;李白曾以诗酒为伴&#xff0c;游历山川&#xff0c;挥洒才情。而今&#xff0c;若李白穿越时空&#xff0c;手握现代科技之利器——SketchUp Pro 2024&#xff0c;定会以诗意之笔&#xff0c;描绘这款软件的神奇与魅力。 初识SketchUp Pro 2024 初…

k8s record 20240708

一、PaaS 云平台 web界面 资源利用查看 Rancher 5台 CPU 4核 Mem 4g 100g的机器 映射的目录是指docker重启后&#xff0c;数据还在 Rancher可以创建集群也可以托管已有集群 先docker 部署 Rancher&#xff0c;然后通过 Rancher 部署 k8s 想使用 kubectl 还要yum install 安…