zoukankan      html  css  js  c++  java
  • C++程序编译过程

    首先,编写最简单的C++代码并保存为main.cpp:

    Hello word
    1 #include <iostream>
    2 using namespace std;
    3 
    4 int main(int argc, char* argv[])
    5 {
    6     cout << "Hello world!" << endl;
    7     return 0;
    8 }

    使用命令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可执行程序

                                                                                                  

  • 相关阅读:
    Laravel 中查询 where 记录
    eclipse svn重定位(relocate)
    使用git ftp发布我个人的hexo博客内容
    oracle数据库查询常用语句
    telnet关闭tomcat
    XML字符串解析成对象的时候应注意空格
    去除焦点边框线
    如何查看和更改mysql数据库文件存放位置
    设置div,td失去焦点
    (加减乘除)字符串计算机
  • 原文地址:https://www.cnblogs.com/litterrondo/p/2880281.html
Copyright © 2011-2022 走看看