C++程序编译过程
2013-01-28 17:25
204 查看
首先,编写最简单的C++代码并保存为main.cpp:
Hello word
使用命令g++ main.cpp,将会编译连接得到可执行文件a.out,(这里需要明确的是g++会调用gcc,而gcc实际上包装了后台一些程序,根据不同的参数去调用相应的程序进行处理)。
事实上从源文件main.cpp到可执行文件a.out的过程包括了如下的4个主要步骤:
预处理(Preprocessing)
编译(Compliation)
汇编(Assembly)
链接(Linking)
1. 预处理
预处理调用预处理器cpp, 主要处理包括以下过程:
文件包含。处理#include预编译指令,将被包含的文件插入到该预编译指令所在位置。
条件编译。处理#if #indef #elif #else #endif 等条件预编译指令,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。
布局控制。处理#progma预编译指令,为编译程序提供非常规的控制流信息。
宏替换。处理#define预编译指令,展开宏定义。
其它一些预处理工作,如删除所有注释 “//”和”/* */”,添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
预处理命令:
gcc - E main.cpp -o main.i (或g++ -E main.cpp -o main.i)
-E 表示只进行预处理。也可以用命令cpp(the C Preprocessor)完成预处理:
cpp main.cpp > main.i
生成的 *.i 是预处理之后的代码。
2.编译
执行编译程序cc1plus(c语言则是cc1), 主要工作是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及代码优化后生成相应的汇编代码。
命令:
gcc –S main.i –o main.s
或者
/usr/lib/gcc/i586-suse-linux/4.1.2/cc1plus main.cpp
如果是c源文件,则执行
/usr/lib/gcc/i586-suse-linux/4.1.2/cc1 main.c
生成的 *.s 是汇编代码。
3.汇编
执行汇编命令as, 是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
命令:
gcc -c main.cpp -o main.o
或者
as main.s -o main.o
4.链接
调用链接器ld, 链接程序运行所依赖的目标文件,以及所依赖的其它库文件,最后生成可执行文件。
ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。
链接部分需要注意的是:对于c++源程序,gcc不能自动和c++的库链接,所以只能使用g++来链接。
通常情况下,对C++源代码,我们直接使用g++命令完成了上述的所有过程。
g++ -o main main.cpp
g++ main.cpp
总结过程就是:
main.cpp -->预处理(cpp)--> main.i -->编译(as)--> main.s -->汇编(as)--> main.o(依赖的其它 *.o) -->链接(ld)--> main可执行程序
Hello word
#include <iostream> using namespace std; int main(int argc, char* argv[]) { cout << "Hello world!" << endl; return 0; }
使用命令g++ main.cpp,将会编译连接得到可执行文件a.out,(这里需要明确的是g++会调用gcc,而gcc实际上包装了后台一些程序,根据不同的参数去调用相应的程序进行处理)。
事实上从源文件main.cpp到可执行文件a.out的过程包括了如下的4个主要步骤:
预处理(Preprocessing)
编译(Compliation)
汇编(Assembly)
链接(Linking)
1. 预处理
预处理调用预处理器cpp, 主要处理包括以下过程:
文件包含。处理#include预编译指令,将被包含的文件插入到该预编译指令所在位置。
条件编译。处理#if #indef #elif #else #endif 等条件预编译指令,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。
布局控制。处理#progma预编译指令,为编译程序提供非常规的控制流信息。
宏替换。处理#define预编译指令,展开宏定义。
其它一些预处理工作,如删除所有注释 “//”和”/* */”,添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
预处理命令:
gcc - E main.cpp -o main.i (或g++ -E main.cpp -o main.i)
-E 表示只进行预处理。也可以用命令cpp(the C Preprocessor)完成预处理:
cpp main.cpp > main.i
生成的 *.i 是预处理之后的代码。
2.编译
执行编译程序cc1plus(c语言则是cc1), 主要工作是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及代码优化后生成相应的汇编代码。
命令:
gcc –S main.i –o main.s
或者
/usr/lib/gcc/i586-suse-linux/4.1.2/cc1plus main.cpp
如果是c源文件,则执行
/usr/lib/gcc/i586-suse-linux/4.1.2/cc1 main.c
生成的 *.s 是汇编代码。
3.汇编
执行汇编命令as, 是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
命令:
gcc -c main.cpp -o main.o
或者
as main.s -o main.o
4.链接
调用链接器ld, 链接程序运行所依赖的目标文件,以及所依赖的其它库文件,最后生成可执行文件。
ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。
链接部分需要注意的是:对于c++源程序,gcc不能自动和c++的库链接,所以只能使用g++来链接。
通常情况下,对C++源代码,我们直接使用g++命令完成了上述的所有过程。
g++ -o main main.cpp
g++ main.cpp
总结过程就是:
main.cpp -->预处理(cpp)--> main.i -->编译(as)--> main.s -->汇编(as)--> main.o(依赖的其它 *.o) -->链接(ld)--> main可执行程序
相关文章推荐
- C/C++程序编译运行生成过程分析
- C/C++程序编译运行生成过程分析
- C/C++程序从编译到最终生成可执行文件的过程分析
- 深度剖析一个典型的C/C++程序的编译、链接以及执行的过程
- C/C++程序的编译过程
- C++ —— C++程序编译的四个过程
- c++程序编译过程
- C++程序编译过程详解
- 菜鸟C++精髓学习笔记--C++程序内部执行过程(预处理、编译、链接过程的作用)
- c/c++程序编译连接过程
- C/C++程序从编译到最终生成可执行文件的过程分析
- c++程序编译过程
- 【C++】01 一个程序编译链接的过程
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- Windows系统下用命令行编译C/C++程序过程总结
- c/c++程序的编译过程资料汇总
- C/C++程序编译运行生成过程分析
- C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
- 关于C/C++运行库编译出来的程序的运行过程~
- C/C++——程序实现过程之编译、链接和执行