Linux编译器 gcc/g++

gcc/g++的简介

GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器,使用g++同样可以编译C语言。编译C语言要经过预处理,编译,汇编,链接这四个过程。

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

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面,一般而言经过预处理后的文件命名统一格式为 xxx.i
-S 编译到汇编语言不进行汇编和链接,一般而言经过编译后的文件命名统一格式为 xxx.s
-c 编译到目标代码,一般而言经过汇编后的文件命名统一格式为 xxx.o
-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” 是指目标文件,这里把预处理后的文件命名为test.i,   “ .i ”文件为已经过预处理的 C 原始程序,一般而言经过预处理后的文件命名统一格式为 xxx.i 。

如何在vim中同时编辑多个文件

1.输入命令vim 文件1 文件2 ,例如vim test.c test.i

2.在底行模式用ls命令查看缓冲区, %a表示正在编辑的文件

3. 使用分屏(Split Screen),在命令模式按下Ctrl + Ws 进入分屏模式,该为上下分屏,或者Ctrl + W, v该为左右分屏,例如以下为左右分屏

4. 在左右两屏中切换,在命令模式按下Ctrl + W, w 可以在两屏中来回切换

5.切换编辑的文件,在底行模式按bnext,可以切换到第二个文件

6. 保存退出

保存所有并退出:wqa

编译(生成汇编)

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

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

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

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

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

我们的C语言内部,调用很多库函数,比如printf,scanf等等。它们并没有在编译的时候展开,不信你可以回去看看那个.i文件,绝对没有展开一个叫做printf的函数。那么C语言要如何拿到这个函数,并调用它呢?这就涉及到链接的过程。如果你想要让你的.c,.i,.s,.o中的任意一个文件变成链接后的文件,不用带任何选项,直接执行gcc即可,因为直接执行就是生成可执行文件,这已经是链接后的文件了。这样最后生成的test就是可执行文件了,在Windows中,可执行文件的后缀就是.exe,因为Windows通过后缀区分文件,而Linux不通过后缀区分文件.

实例: gcc  test.o –o test

函数库

我们的 C 程序中,并没有定义 “printf” 的函数实现 , 且在预编译中包含的 “stdio.h” 中也只有该函数的声明 , 而没有定义函数的实现, 那么 , 是在哪里实 “printf” 函数的呢 ?
最后的答案是 : 系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了 , 在没有特别指定时 ,gcc 会到系统默认的搜索路径“/usr/lib” 下进行查找 , 也就是链接到 libc.so.6 库函数中去 , 这样就能实现函
“printf” , 而这也就是链接的作用.

1. lld 命令

功能:可以通过ldd指令来查看一个可执行文件链接了那些库

比如第二行的libc就是C语言的标准库。另外的,它还指明了一些库在系统中的路径。也就是说我们的很多头文件,都已经早早地在Linux中下载好了,因此我们可以在Linux上运行C语言代码。

比如说/usr/include路径下的文件:

2. 函数库一般分为静态库和动态库两种

静态库是指编译链接时 , 把库文件的代码全部加入到可执行文件中 , 因此生成的文件比较大 , 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反, 在编译链接时并没有把库文件的代码加入到可执行文件中 , 而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为 “.so”, 如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后 ,gcc 就可以生成可执行文件。
Linux中,动态库以.so为后缀,静态库以.a为后缀
Windows中,动态库以.dll为后缀,静态库以.lib为后缀
如果我们想要生成静态链接的文件,则额外加上选项 -static

动态链接
优点 :省空间(磁盘的空间,内存的空间),程序体积小,加载速度快
缺点 :依赖动态库,程序运行可移植性较差

静态链接
优点: 不依赖第三方库,程序运行可移植性较好
缺点:浪费空间(磁盘的空间,内存的空间),程序体积大,加载速度慢


 

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

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

相关文章

ES6及其后续版本的新特性的理解

ES6及其后续版本(如ES7、ES8等)的新特性的理解 ES6(ECMAScript 2015)引入了一系列重要的语言和语法特性,旨在提升JavaScript的简洁性和可读性。后续的ES7、ES8等版本继续扩展了这些特性。以下是一些关键新特性&#x…

爱迪特两年创业板上市路:销售费用率远高同行,侵权风险引关注

《港湾商业观察》施子夫 王璐 从2022年4月7日就冲刺创业板的爱迪特(秦皇岛)科技股份有限公司(以下简称,爱迪特),预计将很快登陆资本市场。 爱迪特日前披露中签结果:本次发行股份数量为约1902…

关于最强模型Claude 3.5 Sonnet,你需要知道的10条总结!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

Python自动化(8)——pyqt5界面

Python自动化(8)——pyqt5界面 注意:pyqt5的界面使用时必须有app QApplication(sys.argv)这行代码,否则会出现错误并且无法显示窗口:QWidget: Must construct a QApplication before a QWidget 一些基础的控件 QMainWindow QMainWindow是…

Java NIO Buffer概念

针对每一种基本类型的 Buffer ,NIO 又根据 Buffer 背后的数据存储内存不同分为了:HeapBuffer,DirectBuffer,MappedBuffer。 HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配,在堆中分配一个数组用来存放 Buffe…

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式

【经验分享】免费版虚拟机VMware Workstation Pro 17下载方式 前言一、免费虚拟机下载方式二、 安装过程总结 前言 我真的是服了,现在的CSDN时效性为什么这么差了。都快一个月了还没有博主更新个人免费版虚拟机VMware Workstation Pro,甚至很多人还不知…

【运维】使用 Docker Compose 快速启动项目全流程指南

文章目录 docker-compose启动项目流程1. 安装 Docker 和 Docker Compose2. 准备 Docker Compose 文件3. 启动 Docker Compose 服务4. 检查运行状态5. 停止服务示例 docker-compose.yaml 文件 为什么要用docker-compose1. 微服务架构的实现2. 依赖管理3. 简化开发和测试环境4. 方…

RFID技术在汽车轮胎加工工艺中的革新应用

RFID技术在汽车轮胎加工工艺中的革新应用 物联网技术的飞速发展,无线射频识别(Radio Frequency Identification,简称RFID)技术因其独特的优势,在各行各业中展现出巨大的应用潜力。特别是在汽车制造业,RFID…

推荐一款好用的浏览器翻译插件——欧路翻译

近些年,机器翻译的效果越来越好,于是也有更多的开发者,开发了免费使用的浏览器翻译插件。这大大的帮助了我们查看国外的网站,有利于大家获取更多的信息。 在此,给大家推荐一款免费好用的浏览器插件——欧路翻译。支持…

我在高职教STM32——LCD液晶显示(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就…

[经验] 如何做虾炒白菜 #学习方法#知识分享

如何做虾炒白菜 虾炒白菜的做法 虾炒白菜是一道营养丰富且美味可口的菜肴,虾肉的鲜嫩与白菜的甜脆相结合,口感极佳。接下来,让我们一起来学习一下虾炒白菜的详细做法。 食材准备 虾:约200克(选用新鲜活虾&#xff…

【深度学习】python之人工智能应用篇——视频生成技术

视频生成技术是一种基于深度学习和机器学习的先进技术,它使得计算机能够根据给定的文本、图像、视频等单模态或多模态数据,自动生成符合描述的、高保真的视频内容。这种技术主要依赖于深度学习模型,如生成对抗网络(GAN&#xff09…

基于 Native 技术加速 Spark 计算引擎

本文整理自 2024 年 6 月 DataFunSummit 2024 OLAP 架构峰会 Lakehouse 湖仓一体化架构论坛的同名主题分享。 今天分享的主题是基于 Native 技术加速 Spark 计算引擎,大家将会了解到如何基于 ClickHouse 来改造 Spark 引擎,最终获得较为可观的性能提升。…

C++实现多线程安全的生产者消费者字节缓冲区

文章目录 介绍实现细节**BytesBuffer 类****生产者和消费者** 性能优化总结 介绍 本文介绍如何使用C实现一个多线程安全的简单字节缓冲区,并进行性能测试。 实现细节 BytesBuffer 类 BytesBuffer 类通过使用条件变量和双缓冲区机制,实现了生产者和消…

【Linux】 在 Linux 中更换主机名

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 在 Linux 系统中,更换主机名是系统…

使用Redis Lua脚本实现高级限流策略

引言 在现代的Web应用中,限流是一个非常重要的功能,它帮助我们控制对某些资源的访问频率,以防止系统过载和滥用。Redis是一个高性能的键值存储系统,它的原子操作和Lua脚本功能为实现复杂的限流策略提供了强大的支持。本文将详细介…

day50 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

1143. 最长公共子序列 提示 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删…

大腾智能,基于云原生的国产工业协同平台

大腾智能是一家基于云原生的国产工业软件与数字化协同平台,专注于推动企业数字化转型与升级,为企业提供一系列专业、高效的云原生数字化软件及方案,推动产品设计、生产及营销展示的革新,实现可持续发展。 大腾智能旗下产品 3D模型…

USB2.0学习4--USB包结构和包类型

目录 1. USB包基本结构 1.1 SOP域(Start Of Packet) 1.2 SYNC域(同步域) 1.3 PID域(标识域) 1.4 地址域(ADDR) 1.5 帧号域(Fram) 1.6 数据域&#xff…

前端也需要知道的一些常用linux命令

前端也需要知道的一些常用linux命令 1.问题背景2.连接工具(SecureCRT_Portable)a.下载工具b.连接服务器c.登录到root账户 3.基本命令a.cd命令和cd ..b.ll命令和ls命令c:cp命令d.rm命令e:rz命令f.unzip命令g.mv命令h.pwd命令(这里没有用到&…