零基础上手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

2259

被折叠的 条评论
为什么被折叠?



