零基础上手gcc/g++:Linux编译轻松学

零基础上手gcc/g++:Linux编译轻松学


前言
首先我们来学习一下gcc、g++二者之间的关系
gcc英文全称为:GUN C Compiler,是GCC中的c编译器
g++英文全称为:GUN C++ Compiler,是GCC中的c++编译器。
gcc和g++ 两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。gcc和g++都存在于GCC编译器中,可以说是同宗同源,他们指令的功能也是相同的,后面我们会以gcc为里展开介绍,g++大家平替过来即可。

一、背景知识

我们在Windows下编写程序时会有四个步骤:

1、预处理:处理以#开头的预处理器指令。像C、C++语言中,会把头文件内容包含进来(头文件展开),进行宏替换,删除注释部分等操作。
2、编译:将预处理后的代码翻译成汇编语言。编译器会检查语法等错误。
3、汇编:把汇编语言代码转化为机器语言指令,生成目标文件。这些目标文件包含机器码(二进制文件)。
4、链接:将多个目标文件和库文件链接起来,形成可执行文件。

我们在Linux下使用gcc/g++进行编译时,仍会遵循上述步骤,接下来我们就根据这种过程,展开对gcc/g++基本功能的介绍。

二、基础指令

注:在次强调一下,gcc和g++指令功能相同。

2.1、gcc的直接使用

语法:gcc 【选项】源文件 -o 可执行文件
这里‘-o’选项是帮助我们给生成的可执行文件命名,如果没有‘-o’选项它会默认生成一个名为a.out的可执行文件

首先我们先在.c文件中写一个简单的程序

直接使用gcc编译源文件:

使用‘-o’选项帮助生成文件命名:

执行可执行程序:

接下来我们介绍gcc的各种选项,为防止大家误解,这里需要提前告知的是,程序编译本质上就是将我们使用的各种语言翻译为机器语言的过程,而每个选项的作用仅是对源文件翻译到某个程度就停止!!!!!!

2.2、预处理文件

语法:gcc -E 源文件 -o 预处理得到的文件
这里如果没有'-o'选项,处理结果默认显示在屏幕上,对于预处理处理所得文件,文件名没有要求,文件后缀一般以‘.i’结尾。
这里‘-E’就是从现在开始进行翻译,将预处理工作完成后停止(不需要继续执行下去)。

预处理带‘-o’选项:

打开文件,对比一下原文件和处理后文件内容

左边为预处理后的文件,可以看到在预处理阶段发生了,展开头文件、宏替换、去除注释等一系操作。
为了方便对比展示,图中左部分仅截取了部分信息。
预处理不带‘-o’选项:

头文件展开信息,内容过程,仅展示部分,接下来不会单独展示出来了,感兴趣大家自己尝试。

2.3、编译文件

语法:gcc -S源文件 -o编译得到的文件
编译得到的文件,一般都以‘.s’作为文件后缀。
'-S’选项表示从现在开始进行翻译,将编译工作完成后停止。

翻译至编译阶段得到的文件:

如果大家之前深入学习过c/c++等语言,应该会对汇编有印象的。

2.3、汇编文件

语法:gcc -c源文件 -o 汇编得到的文件
'-c’选项表示从现在开始进行翻译,将汇编工作完成后停止。

汇编得到的文件为可重定位二进制文件,简称为目标文件,vs下以‘.obj’为后缀,而在Linux中我们一般都以‘.o’作为文件后缀。

翻译至汇编阶段得到文件(使用vim编辑器打开):

经处理得到的文件为二进制文件,在这里是因为我们使用vim打开的文件,而vim是文本编辑器,所以会呈现出这种现象。
虽然这个阶段得到的文件为二进制文件(可以被计算机识别),但是它仍然无法运行,这是因为目前形成的文件还需要经过链接。

2.4、链接

作用:将重定位为目标二进制文件和库(如:c标准库等)进行链接形成可执行程序。
链接部分的知识太多了,我会单独用一篇文章进行介绍。

总结
在学习Linux之前我们就应该了解,Linux本身就是使用C语言来写的,所以上面你可能出现的疑问:
1、在Windows系统下我们安装了编译软件,才可以编写程序了,Linux是为什么可以编写程序呢?
答:其实在Windows下我们不仅要知道安装了编译原件,更应该认识在安装软件的同时我们也下载了一些标准库,这些标准库包含了头文件、库函数的实现方法等,因为有这些我们才可以进行程序的编写,而在Linux中,这是默认安装的。如:头文件路径:/usr/include c标准库路径:/usr/lib64/
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/2301_80774875/article/details/145175285

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值