Linux编译器---gcc/g++的使用

一、背景知识

       在Linux系统中,GCC是一个非常重要的工具,因为它使得开发者可以使用C和C++等语言编写高性能的程序。它主要包括四个方面:

       预处理(进行宏替换)

       编译(生成汇编)

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

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

二、gcc具体实现

        格式 gcc [选项] 要编译的文件 [选项] [目标文件]

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

       预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

       预处理指令是以#号开头的代码行。

       实例: gcc –E text.c –o text.i

       选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

       选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

练习展示:

       首先用vim编辑一个text.c文件:(如果对vim不了解可以进我主页进行学习)

       接下来我们进行预处理并查看:

       我们可以发现,经过预处理后的代码,我们写的注释不见了,且前741行都是我们的头文件展开,而且我们的M被替换为了100。

2、编译(生成汇编)

       在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

       用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

       实例: gcc –S text.i –o text.s

练习展示:

       由图可以看出,之前写的C语言代码都变成了汇编语言。

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

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

       实例: gcc –c text.s –o text.o

       接下来我们可以看出来,从这里开始形成了二进制指令。

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

       在成功编译之后,就进入了链接阶段。

       实例: gcc text.o –o text

5、完整展示

6、函数库概念

       我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

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

       库函数有两种:静态库和动态库

6.1静态库

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

静态库总结:    

       优点:不依赖库,同类型平台中都可以直接运行使用

       缺点:可执行程序体积比较大,比较浪费资源---资源磁盘,内存,网络等资源

6.2动态库

       动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。

       动态库一般后缀名为".so",如前面所述的libc.so.6就是动态库。

       gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件。

如:

       gcc hello.o -o hello

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

动态库总结:

       优点:比较节省资源,不会出现太多的重复代码

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

7、gcc选项

        -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

        -S 编译到汇编语言不进行汇编和链接

        -c 编译到目标代码

        -o 文件输出到 文件

        -static 此选项对生成的文件采用静态链接

        -g 生成调试信息。GNU 调试器可利用该信息。

        -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

        -O0                -O1                  -O2

        -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

        -w 不生成任何警告信息。

        -Wall 生成所有警告信息

8.gcc理解记忆

       gcc的实现过程中,预处理-E,编译-S,汇编-c,是不是像我们键盘左上角的ESC键呢?要记得c是小写哦!


结语:Linux编译器关于vim使用的分享到这里就结束了,没有进行展示的操作大家可以自行练习,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot vue mysql的在线竞拍拍卖系统

基于SpringBoot的在线拍卖系统,springboot vue mysql (毕业论文10168字以上,共34页,程序代码,MySQL数据库) 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue 【技术栈】 Java, SpringBoot, Jquery, Layui, MYSQL, HTML, CSS, JAVASCRIPT, Ajax 7707 java毕业设计 springboot v…

JTS: 19 IndexedPointInAreaLocator 判断是否在点在面的内部

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.locate.IndexedPointInAreaLocator; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom…

web 自动化测试,这8 个核心知识点,你一定得掌握

使用 cypress 进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用 JavaScript 作为编程语言。 传统主流的 selenium 框架是支持多语言的,大多数 QA 会的 python 和 Java 语言都可以编写 selenium 代码,遇到需要编写 js…

一文详解进销存管理系统!

一、什么是进销存管理系统? 进销存软件是一种针对制造业企业设计的管理软件系统,旨在协调和优化企业的生产、采购、销售以及库存管理等方面的活动。该系统的主要目标是提高企业的生产效率、降低库存成本、优化供应链,并增强企业的整体运营效…

【中间件篇-Redis缓存数据库08】Redis设计、实现、redisobject对象设计、多线程、缓存淘汰算法

Redis的设计、实现 数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的…

<MySQL> MySQL中查询(retrieve)数据的基础操作

目录 一、查询(retrieve) 1.1 查询数据的方式概述 二、全列查询 2.1 语法 2.2 操作演示 2.3 全列查询需要慎重使用 三、指定列查询 3.1 语法 3.2 操作演示 四、表达式查询 4.1 语法 4.2 操作演示 4.3 null 参与表达式计算 4.3 表达式查询存…

【Proteus仿真】【Arduino单片机】简易计算器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、4*4矩阵键盘等。 主要功能: 系统运行后,操作矩阵按键可实现简单四则运算。 二、软件设计 /* …

JDK并发修改异常的一个“BUG“

很多电商公司早期的架构都是基于PHP,所以我身边会有很多很厉害的PHP老哥,但现在都在写Java。昨天看到他在看Java的并发修改异常,正打算秀一波操作,却被他的一个问题难住了: public class ForeachTest {public static …

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点,使得攻击者无法发现恶意攻击的目标网络资源,从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等,帮助游戏、金 融、电子商务、互联网、政企等行业抵…

centos7 在线安装python3

在线安装命令 yum install -y python3 输入命令之后等待安装完成 查看版本 查看版本3 输入命令 python3 看到版本号为3.6.8 查看版本2 输入命令 python2 看到版本号为2.7.5

Java基础——方法参数值的传递机制

方法必须由其所在类或对象调用才有意义。 形参:方法声明时的参数。实参:方法调用时实际传给形参的参数值。 Java中方法的参数传递方式只有一种:值传递(即将实际参数值得副本传入方法内) 形参是基本数据类型&#xf…

「我在淘天做技术」假如你五行属商家,如何算好账?

给讲讲大家淘天淘工厂财务开发的相关内容。 财务开发好陌生,是什么?好了,现在假如你五行属商家,并且就在淘宝上卖东西。当消费者买了你的东西,淘宝是不是需要给你结算这笔交易订单的钱,另外淘宝是不是还要收…

阿里全系产品崩上了热搜,我是有些失望的

双十一刚刚过,没想到阿里巴巴全系产品却又崩上热搜了。看来阿里的不少程序员同学今天又是在加班中度过了,心疼,希望你们把班加了就可以了,锅就别背了。 据了解,截至目前,本次修复进展如下: 17:…

7.现代卷积神经网络3-GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 深度卷积神经网络 AlexNet一、AlexNet1、AlexNet2、机器学习3、几何学4、特征工程5、HardWare6、数据集7、AlexNet的改进的地方8、AlexNet架构-卷积池化9、AlexNet架构-卷积池化10、AlexNet架构-全连接层11、更多改变细…

React Native简介 说明为什么要学习React Native

首先 什么是 React Native ? React Native 是 Facebook 在 React.js Conf 2015 上推出了开源框架 React Native (简称 RN)是 React 的一个原生 (Native) 扩展 它允许我们通过 React 语法,来开发ios 和Android 原生应用 简单说 由Facebook发布 是一种Re…

【EDAS论文投稿】

背景 第一次使用这个系统投稿,不是很熟练甚至差点错过了投稿时间,所以记录一下投稿过程中出现的致命问题。 注册、登录就不用说了 登陆后选择自己的会议的symposia 添加文章信息;依次添加作者信息 在第三步长传文件时,系统提示…

PNAS | 蛋白质结构预测屈服于机器学习

今天为大家介绍的是来自James E. Rothman的一篇短文。今年的阿尔伯特拉斯克基础医学研究奖表彰了AlphaFold的发明,这是蛋白质研究历史上的一项革命性进展,首次提供了凭借序列信息就能够准确预测绝大多数蛋白质的三维氨基酸排列的实际能力。这一非凡的成就…

行情分析——加密货币市场大盘走势(11.13)

大饼上涨太快,又开始震荡,但上不去,所以目前来看差不多要做回踩动作,入场空单性价比较高。而且从MACD日线来看,也是进入空头趋势,RSI(14)也是进入了超买区间,值得入手空单…

sqli-labs关卡15(基于post提交的单引号布尔盲注)通关思路

文章目录 前言回顾上一关知识点二、靶场第十五关通关思路1、判断注入点2、猜数据库长度3、猜数据库名字4、猜表名长度5、猜表名名字6、猜列名长度7、猜列名名字8、猜数据长度9、猜数据名字 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击。注…

探索C#事件(Event)的强大应用

摘要 在现代软件开发中,对象之间的通信和交互是一个常见而重要的问题。为了解决这个问题,C#作为一种面向对象的编程语言提供了一种强大的特性:事件(Event)。事件可以帮助开发人员实现对象间的松耦合,提高代…