「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
前言
昨天简单介绍了一个简单的C++程序的几个要素,今天来简单的看下其中的编译过程,因为Window环境中的visual studio这个IDE会直接忽略其中的编译过程产生的文件,今天在Linux环境中来测试一下,基于Ubuntu20.04,因为自己的电脑是双系统的,Linux系统自带G++编译器。
先简要总结一下其中的过程,我们再进行实验,看过程中产生了什么样的文件。
编译过程有很多阶段,可以分成两类,1是编译,2是链接。
过程
编译
预编译
1.把使用include引入的标准库代码或者其他源文件先引入
2.展开宏定义的内容,删除宏定义代码,define
就是C++中的宏定义
宏定义
宏定义就是将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。现在可以简单理解为定义全局变量
,这个变量
不仅可以使变量还可以是函数,需要注意宏定义中的特殊符号
接着处理条件编译指令,条件编译指令
一般指:“#if”、“#ifdef”、“#elif”、“#else”、“endif”,这里不是指一般的流程判断指令,这些条件编译指令是告诉编译器该怎么执行编译流程的
3.删掉注释,语法分析,添加行号,文件标识
编译&汇编
就是把处理好的代码直接转换成汇编代码。汇编代码就是告诉CPU怎么去操作内存和硬件的代码了,然后汇编后的代码给到CPU执行的时候就是二进制代码了。此时汇编代码就是成可重定位目标程序的.o文件
链接
.o文件或者一些库文件会连接到系统文件,库文件(.lib)打包成一个可执行文件,这个可执行文件一般在Window中为.exe后缀的文件,链接的功能就是把优化过后自己编写的源码连接上其需要的其他文件组成一个能够被操作系统装入执行的统一整体的文件。
实践
G++
g++是GNU组织推出的C++专用编译器,跟gcc编译器一样出名,gcc是很多语言通用的编译器,gcc是一个编译器软件集合,然后GNU是一个自由软件组织,也就是说g++编译器不是一个人或者一个公司的产品,它说很多大佬合作产出的软件,现在的linux系统也叫GNU / Linux系统,最开始全世界的程序员合作开发linux系统的时候最开始开发的就是编译器,最初的语言都是编译型语言,有了好编译器才会有好编程语言。
现在查看系统g++是否安装:g++
,使用g++ -v
,可以看到我自己安装版本是9.3.0
然后新建一个上篇代码文件hello.cpp
预处理
今天学习了编译过程,就先使用g++编译器命令预处理一下源文件,看看预处理过后的文件
g++ -E hello.cpp -o hello.i
-E
就是预处理, -o
输出文件文件,我们现在看看hello.i,比我想象中的要长很多,2W多行,引入一些C++的便准库,还有其他的库文件
编译
使用-S命令
g++ -S hello.cpp -o hello.s
可以看到汇编指令了,常见的有movq
,call
,leaq
,操作指针和跳转指令
汇编
生成可执行的二进制目标文件
g++ -C hello.cpp -o hello.o
因为此时没有其他链接的文件时此时就可以执行了目标文件了
这时候这个汇编文件可以使用g++链接命令生成一个可执行文件
g++ hello.o
因为兼容问题实际情况是报错的,搜集到的资料表明可能因为C++语法和其他的标准不断地在更新,编译器无法做到实际更新。
总结
在通常想运行C++源文件的话会使用g++编译器忽略掉命令前缀 g++ hello.cpp -o hello
直接生成可执行文件,直接在系统命令行运行该文件
今天稍微实践了一下C++的编译过程,还是挺有趣的,学到了很多,实践后映像更加深刻了,网上还没收集到相关的实践内容,只有一些g++命令行展示,下篇开始学习C++的基本语法。