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

2020-04-20 17:12:39 浏览数 (1)

文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever

由于微信不允许外部链接,你需要点击页尾左下角的“阅读原文”,才能访问文中的链接。

学习路线

  • 【资源】一个C/C 开发工程师的学习路线(已经无路可退,唯有逆风飞翔)【内附资源页】
  • 【GitHub】Cpp-Prime5 Cpp-Primer-Plus6 源代码和课后题
  • 《C Primer》学习笔记/习题答案 总目录

0、前言

本人电脑系统是Windows10。

VS版本是2013。

WinGW版本是8.1。

g 版本同上。

1、正文

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,得到最终结果。

2、安装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 的路径。

3、例子

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

代码语言:javascript复制
#include <iostream>
using namespace std;
int main(){
	cout << "HelloWorld" << endl;
	return 0;
}

在VS中运行代码没有问题,输出如下:

下面在 g 中验证一下编译的四个过程。

1、✏ 切换目录

在这里插入图片描述

2、✏ 验证过程

4、总结

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

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

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

0 人点赞