一.【C++】gcc的编译过程
2018-01-21 15:25
211 查看
在大一的第一学期,学习C语言,在选课的时候选择了C++,就想利用这个寒假先来玩一下C++,对于C++以及前面的C,为了更好的理解代码如何变成了程序(即从.cpp变成.exe),我想先从它的编译过程开始研究。
C++的主要编译过程分为:预处理、编译、汇编、链接这四个过程。
C++编译过程
*预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:
1. 将所有的#define删除,并且展开所有的宏定义。
2. 处理所有条件编译指令,如#if,#ifdef等。
3. 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。
4. 删除所有的注释//和 /**/。
5. 添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息。
6. 保留所有的#pragma编译器指令,因为编译器须要使用它们。
C++的主要编译过程分为:预处理、编译、汇编、链接这四个过程。
C++编译过程
第一步:预处理
将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之后对于c语言编译器会生成一个.i 文件。C++会生成.ii文件。*预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:
1. 将所有的#define删除,并且展开所有的宏定义。
2. 处理所有条件编译指令,如#if,#ifdef等。
3. 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。
4. 删除所有的注释//和 /**/。
5. 添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息。
6. 保留所有的#pragma编译器指令,因为编译器须要使用它们。
第二步:编译
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。第三步:汇编
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。第四步:链接
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。总结:
咱们这里主要讲述了使用MinGw编译C++程序的整个过程。一共涉及到4个过程,分别是预处理、编译、汇编、链接等四个过程。预处理主要由预处理器cpp程序完成。编译是将预处理完成生成的预处理文件编译成汇编代码的过程。主要由ccl 编译程序完成。汇编是将文本形式的汇编语言代码翻译成二进制机器码的过程。这个过程主要由汇编器as完成。链接主要由连接器将二进制对象文件和相关其他的静态、动态链接库打包生成操作系统可执行文件。MinGw主要提供的g++程序能够帮助我们完成整个过程。也可以在某些步骤进行单独操作。而且可以保留临时文件等。相关文章推荐
- C/C++学习 - gcc编译过程查看汇编代码
- C/C++编译过程(gcc)
- C++学习笔记--GCC编译过程
- C/C++编译过程(gcc)
- C++工程师面试宝典系列之Linux编程之GCC编译工具实践
- [转载]描述C,C++编译和链接过程
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- 和菜鸟一起学c之gcc编译过程及其常用编译选项
- C++程序从编译到链接然后再到调用的整个过程
- C & C++的编译过程详解
- gcc 编译过程和编译优化
- [GCC for C++]编译选项---IDE掩盖下的天空
- gcc编译过程
- linux下使用gcc编译运行C/C++程序
- 用gcc编译c与c++混编的工程
- gcc 编译过程
- eclipse c++ 编译OpenCV-3.3.0过程及遇到的问题
- gcc编译C和C++程序
- C++ 用条件编译 控制开发过程中输出调试信息
- linux下编译c文件的过程(gcc)