专栏C++学习笔记

声明:

1)本文仅供学术交流,非商用。

2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。

3)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。

4)大家都共享一点点,一起为祖国科研的推进添砖加瓦。



文章目录



        学习路线

        〇、✏ 前言

        本人电脑系统是Windows10。

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

        VS版本是2013。

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

        WinGW版本是8.1。

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

        g++版本同上。

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

        一、✏ 正文

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

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

        图解如下:

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

        1、✏ 预处理

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

        ​g++ -o test.ii -E test.cpp​​ 将 ​​test.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

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

        配置环境变量:把你刚刚安装 WinGW 的 bin 文件路径拷贝一下。

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

        右键【我的电脑】,点击【属性】,然后【高级系统设置】,然后【环境变量】,然后【编辑】用户环境变量,然后【编辑】,然后一顿【确认】。

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

        然后验证一下环境变量是否配置成功,按下 win + R,输入 cmd,回车键之后输入 ​​g++​​,再回车。

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

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

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

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

        三、✏ 例子

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

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


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

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

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

        1、✏ 切换目录

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

        2、✏ 验证过程

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

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

        四、总结

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

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

        • 编译阶段将源程序(*.c/cpp) 转换成为目标代码(一般是 ​​obj​​ 文件,至于具体过程就是上面说的那些阶段),
        • 链接阶段是把源程序转换成的目标代码( ​​obj​​ 文件)与你程序里面调用的库函数对应的代码连接起来形成对应的可执行文件(​​exe​​ 文件),
        • 其他的都需要在实践中多多体会才能有更深的理解。
          【C++100问】C/C++程序执行过程详解之预处理、编译、汇编、链接和执行,以及g++/gcc的安装使用_可执行文件_14

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

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

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