【C++100问】C/C++程序执行过程详解之预处理、编译、汇编、链接和执行,以及g++/gcc的安装使用

专栏C++学习笔记

📢 声明:

1)本文仅供学术交流,非商用。
2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
3)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。
4)大家都共享一点点,一起为祖国科研的推进添砖加瓦。

👉 学习路线

〇、✏ 前言

本人电脑系统是Windows10。
在这里插入图片描述
VS版本是2013。
在这里插入图片描述
WinGW版本是8.1。
在这里插入图片描述
g++版本同上。
在这里插入图片描述

一、✏ 正文

C/C++的编译链接过程是怎么样的?

如果要把我们编写的一个程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行预处理、编译、汇编和链接。

图解如下:
在这里插入图片描述

1、✏ 预处理

预处理器:将 #include 包含的文件内容插入该命令处,检查全文处理 #define 宏定义,处理条件编译命令 #if #endif 将不需要的 code 屏蔽掉,处理完毕后生成修改后的源代码 test.ii

g++ -o test.ii -E test.cpptest.cpp 文件预处理成 test.ii 文件

2、✏ 汇编

汇编器:将汇编源文件翻译成对应的机器指令。

g++ -o test.s -S test.ii 将预处理输出文件 test.ii 汇编成 test.s 文件

3、✏ 编译

编译器:词法分析语法分析,生成一条条的汇编语句如 mov ax,bx,相当于是优化后的汇编语言的源文件

g++ -o test.o -c test.s 将汇编输出文件 test.s 编译成 test.o 文件

4、✏ 链接

链接器:比如说 test.o 里调用了标准库里函数 printf ,连接器的工作就是找到 prinf 所在的目标文件 xx.o 或是 xx.lib 然后将该程序插入到我们的 test.o

g++ -o test.exe test.o 将编译输出文件 test.o 链接成最终可执行文件 test.exe

5、✏ 执行

test 讲执行可执行文件 .exe,得到最终结果。

二、✏ 安装g++

下载地址:https://sourceforge.net/projects/mingw-w64/files/

下载的文件:进入网站后 不要点击 “Download Lasted Version”,往下滑,找到最新版的 “x86_64-posix-seh”。

安装MinGW:下载后是一个7z的压缩包,解压后移动到你想安装的位置即可。

安装位置:D:\mingw64
在这里插入图片描述
配置环境变量:把你刚刚安装 WinGW 的 bin 文件路径拷贝一下。
在这里插入图片描述
右键【我的电脑】,点击【属性】,然后【高级系统设置】,然后【环境变量】,然后【编辑】用户环境变量,然后【编辑】,然后一顿【确认】。
在这里插入图片描述
然后验证一下环境变量是否配置成功,按下 win + R,输入 cmd,回车键之后输入 g++,再回车。

  • 如果提示以下信息[1],则环境变量配置成功。
  • 如果提示以下信息[2],则环境变量配置失败。
  • 如果加了环境变量还是这样,重启。
  • 如果重启了还不行,那就是你自己进行的操作有问题。

[1]:g++: fatal error: no input files
[2]:‘g++’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

gcc -v 可以显示出 gcc 的版本。如果显示出来的版本与你刚下的不同/更老,说明 Path 里原本有老版本的编译器,可能是安装其它IDE时装上的。则需要去掉 Path 里原来的那一个 gcc 的路径。
在这里插入图片描述

三、✏ 例子

来看一个例子,验证整个过程。

#include <iostream>
using namespace std;
int main(){
	cout << "HelloWorld" << endl;
	return 0;
}

在VS中运行代码没有问题,输出如下:
在这里插入图片描述
下面在 g++ 中验证一下编译的四个过程。

1、✏ 切换目录

在这里插入图片描述

2、✏ 验证过程

在这里插入图片描述
在这里插入图片描述

四、总结

C/C++编译的整个过程是非常复杂的,里面涉及到的编译器知识、硬件知识、工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题时多思考、多实践。

一般情况下,只需要知道分成 编译链接 两个阶段就够用了,

  • 编译阶段将源程序(*.c/cpp) 转换成为目标代码(一般是 obj 文件,至于具体过程就是上面说的那些阶段),
  • 链接阶段是把源程序转换成的目标代码( obj 文件)与你程序里面调用的库函数对应的代码连接起来形成对应的可执行文件(exe 文件),
  • 其他的都需要在实践中多多体会才能有更深的理解。
    在这里插入图片描述

如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

回复【福利】即可获取我为你准备的大礼,包括C++,编程四大件,NLP,深度学习等等的资料。

想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是管小亮

一口吃掉你的打赏,嗝~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值