Linux的学习之路:6、Linux编译器-gcc/g++使用

news2024/11/30 6:48:36

摘要

本文主要是说一些gcc的使用,g++和gcc使用一样就没有特殊讲述。

目录

摘要

一、背景知识

二、gcc如何完成

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

2、编译(生成汇编)

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

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

5、函数库

6、静态库和动态库

7、gcc选项

三、思维导图


一、背景知识

GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器套件,初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件,这里的“自由”指的是它尊重用户的自由。GCC支持的编程语言广泛,包括C、C++、Objective-C、Fortran、Java、Ada和Go等,并提供了这些语言的库,如libstdc++和libgcj等。

在GCC中,对于不同后缀的文件,它会有不同的处理方式。例如,对于.c后缀的文件,GCC会将其视为C程序;而对于.cpp后缀的文件,GCC和G++都会将其视为C++程序。此外,编译阶段,G++会调用GCC;但在连接阶段,通常会用G++来完成,因为GCC命令不能自动和C++程序使用的库连接。

在编译过程中,GCC/G++总共需要四步:第一步是预处理,生成.i的文件;第二步是将预处理后的文件转换成汇编语言,生成.s文件;第三步是将汇编语言变为目标代码(机器代码),生成.o的文件,在之前用vs中生成的就是.obj;最后一步是连接目标代码,生成可执行程序。

总的来说,GCC/G++是强大的编译器工具,广泛应用于各种编程环境和任务中,无论是用于程序开发、系统管理还是一般的文本编辑任务,都是不可或缺的工具。

二、gcc如何完成

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

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

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

就是去注释、宏替换、条件编译、头文件展开等等,如下方截图,可以看出注释的东西在预编译后就会消失。

 

2、编译(生成汇编)

C->汇编

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

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

汇编->可重定向二进制目标文件

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

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

链接多个.0、.obj->合成一个可执行文件exe

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

5、函数库

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

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

[ly@VM-24-9-centos learn]$ sudo yum install -y glibc-static

[ly@VM-24-9-centos learn]$ sudo yum install -y libstdc++-static
 

 

6、静态库和动态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcchello.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 生成所有警告信息

三、思维导图

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

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

相关文章

2024-基于人工智能的药物设计方法研究-AIDD

AIDD docx 基于人工智能的药物设计方法研究 AI作为一种强大的数据挖掘和分析技术已经涉及新药研发的各个阶段,有望推动创新药物先导分子的筛选、设计和发现,但基于AI的数据驱动式创新药物设计和筛选方法仍存在若干亟待解决的问题。我们课题组的核心研究…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

服务器端口被扫会出现哪些风险

一、安全风险增加端口扫描是黑客攻击的常见手段之一。通过对服务器端口进行扫描,黑客可以了解服务器的开放端口、服务类型以及可能存在的漏洞。一旦黑客发现漏洞并成功利用,就可能导致服务器被入侵,进而窃取数据、植入恶意软件或进行其他非法…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的电影网站(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMv…

编程规范(保姆级教程)

文章目录 为什么需要编程规范?💡代码检测工具 ESLint💡代码格式化 Prettier💡ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

解决Idea中文乱码

解决 Idea 中文乱码问题的方法通常包括以下几个步骤: 1、调整文件编码:确保项目中的文件编码与 Idea 中的编码设置一致。通常情况下,使用 UTF-8 编码是比较合适的选择。你可以在 Idea 中通过 File -> Settings -> Editor -> File E…

在keil里用c++编程(1)

做嵌入式开发时,我们对使用c语言写的库有强烈的需求,比如eigen,boost等,但是通常来说,我们的开发是围绕c语言进行的,怎么把c的库文件放在c语言环境下进行编译,就是我们需要面对的问题 1.问题来…

代码随想录第36、37天| 435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 435. 无重叠区间 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili 给定一个区间的集合 intervals ,其中 intervals[…

Python项目1 外星人入侵_外星人

在本章中,我们将在游戏《外星人入侵》中添加外星人。首先,我们在屏幕上边缘附近添加一个外星人,然后生成一群外星人。我们让这群外星人向两边和下面移 动,并删除被子弹击中的外星人。最后,我们将显示玩家拥有的飞船数量…

C/C++基础----运算符

算数运算符 运算符 描述 例子 两个数字相加 两个变量a b得到两个变量之和 - 两个数字相减 - * 两个数字相乘 - / 两个数字相除 - % 两个数字相除后取余数 8 % 3 2 -- 一个数字递减 变量a:a-- 、--a 一个数字递增 变量a: a 、 a 其中递…

容错组合导航

在初始值正确的情况下,惯性导航短期精度较高,但是其误差随着时间是累计的。如果要提高惯性导航的长期精度,就必须提高惯性器件的精度和初始读准精度,这必将大大提高成本。 如果将惯性导航与其他导航系统适当地组合起来&#xff0c…

开源项目若依放大招了?

前言 鉴于之前写了篇插件式相关的文章,阅读量比起其它文章可不要好太多,所以我决定继续这个主题! 以前我们公司用的就是Ruoyi,代码比较简单易懂。但是有些功能确实用不上,比如部门和岗位,每次新项目我拉了…

Web程序设计-实验02 CSS页面布局

【实验主题】 影视网站前台模板页设计 【实验任务】 1、浏览并分析多个影视网站(详见参考资源,建议自行搜索更多影视网站)的整体版面布局,对比同一网站不同页面(主页、列表页、详情页)的元素异同——剔除…

探索ChatGPT-Plus:AI 助手全套开源解决方案

探索ChatGPT-Plus:AI 助手全套开源解决方案 ChatGPT-plus是一种新型的对话生成模型,它是在OpenAI的ChatGPT基础上进行了改进和优化的版本。ChatGPT-plus的出现引起了广泛关注,因为它在对话生成方面展现出了更加出色的表现和能力。在本文中&am…

MobX 中 runInAction 的威力:构建原子性状态更新

"原子性状态更新"这个词可以很好地概括 runInAction 的核心功能,即将一组相关的状态更新作为一个整体,要么全部成功,要么全部失败。这种特性对于复杂的异步操作和状态管理非常重要。可以帮助我们构建更加可靠和可预测的 React 应用程序。 怎么理解原子性操作 "…

动态调整学习率方法(仅供自己学习)

目录 一、StepLR 二、MultiStepLR 三、ExponentialLR 四、CosineAnnealingLR 五、ReduceLRonPlateau 六、LambdaLR 小结:学习率调整​​​​​​​ 一、StepLR optimizer torch.optim.SGD(model.parameters(), lrlearn_rate) scheduler torch.optim.lr_sch…

linux重定向符号

将ls命令执行结果重定向到a文件中 将错误ls命令执行结果重定向到a文件中(这里用到前面的标准错误输出重定向)

【C++初阶】C++简单入门(长期维护)

本篇博客是对C的一些简单知识分享,有需要借鉴即可。 C简单入门目录 一、C前言1.C的概念:2.C发展历程3.C如何学? 二、C入门1.C关键字(C98标准)2.命名空间3.C输入&输出①概念说明②使用说明③特征说明④细节拓展⑤cout与cin的意义 4.缺省参…

【24年软考】系统架构设计师论文写作技巧(附范文10篇)

1.快速审题 写作文要先审题,架构师论文命题也是如此。论文命题除了确定题目之外,还会给你写作要求。而这个写作要求会告诉你本命题涉及的知识点有哪些,并给你确立一个写作向。这个可以参考后面的论文真题分析。 2.确定题目 在填写并确认好…

MATLAB有限元结构动力学分析与工程应用-徐斌|【PDF电子书+配套Matlab源码】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…