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

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

  • 相关阅读:
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    C语言博客05--指针
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实验
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/12361355.html
Copyright © 2011-2022 走看看