zoukankan      html  css  js  c++  java
  • 一个C++源文件从文本到可执行文件经历的过程

    一个C++源文件从文本到可执行文件经历的过程

    以Hello World为例进行说明

    首先我们编写一个cpp源程序

    test.cpp

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

    使用g++编译命令时

    g++ -o test test.cpp

    Gcc编译器会将源程序test.cpp 变为一个test可执行文件

    其中会经过四个阶段

    1.预处理阶段

    首先test.cpp(源程序文本)会由预处理器(cpp) 修改

    g++ test.cpp -E >test.i

    变为test.i文件,

    -E选项是只运行C预处理器的选项

    >是重定向一个输出文件 test.i

    可以用文本编辑器打开test.i文件,发现

    我们的程序之前多了很多东西

    实际上就是将头文件#include 库中的内容插入程序文本当中,得到了test.i文件

    2.编译阶段

    在得到了test.i文件后

    就可以进入编译阶段了,编译阶段,编译器(ccl)将文本文件test.i翻译成文本文件test.s,这是一个汇编程序

    我们使用-S编译选项可以得到.s程序

    g++ test.cpp -S

    3.汇编阶段

    得到了汇编程序后,汇编器(as) 会将test.s文件进行汇编,即汇编指令变为机器语言指令,并把这些指令打包成一种 可重定位目标程序并将结果保存在test.o中

    使用 -c 编译选项,该选项只编译生成目标文件,不链接

    g++ -c test.s -o test.o

    4.链接阶段

    当一个程序调用了标准库中的函数,例如printf、cout等,这个函数已经存在于一个已经单独预编译好了的.o文件中,而这个文件必须以某种方式合并到我们的test.o当中,得到test文件

    g++ test.o -o test 动态链接

    g++ tets.o -static -o test静态链接

    2种都可生成可执行文件,前者文件只包含文件命,运行时再链接相关函数,后者编译时便链接相关函数,前者体积小,运行时没后者快,后者体积大。

    这样得到一个可执行目标文件,就可以被加载到内存当中,有系统执行了

  • 相关阅读:
    简单 dp 题选做
    UVa11327
    Codeforces Round #641 (div.2) 题解
    新博客
    数位dp的学习
    stl粗略用法
    cf437C The Child and Toy
    poj1995 Raising Modulo Numbers
    Tarjan的学习
    最短路模板
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/12361355.html
Copyright © 2011-2022 走看看