• g++编译流程


    测试程序test.cpp如下所示:

    #include <iostream>
    using namespace std;
    #define MAX 9
    int main()
    {
        //just for test
        cout << MAX << endl;
        cout << "Hello world!" << endl;
    }
    

    g++编译主要分为四个阶段进行,即预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

    1.预处理

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

    g++的-E选项,可以让编译器在预处理后停止,并输出预处理结果;输出的test.i文件中存放着test.cpp经预处理之后的代码;也可以通过g++ -E test.cpp直接在命令行窗口中输出预处理后的代码;

    如下图所示,在本例中,预处理结果就是将iostream文件(路径为/usr/include/c++/4.8)中的内容插入到test.cpp中,还会做宏的替换、注释的消除;

    iostream与test.i的对比:

    test.i文件最后的部分:

    # 2 "test.cpp" 2
    using namespace std;
    
    int main()
    {
        //消除注释
        cout << 9 << endl;//宏替换
        cout << "Hello world!" << endl;
    }
    

    2.编译

    预处理之后,可以直接对生成的test.i文件进行编译,生成汇编代码:

    g++ -S test.i -o test.s
    

    g++的-S选项,表示在程序编译期间,在生成汇编代码后停止,-o输出汇编代码文件;

    3.汇编

    对于编译生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,

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

    4.连接

    g++链接器是gas提供,负责将程序的目标文件与所依赖的所有附加目标文件连接起来,最终生成可执行文件,附加目标文件依赖静态连接库(.a或者.lib)和动态连接库(.so或.dll)。

    对于汇编生成的test.o,将其与C++标准输入输出库进行连接,最终生成可执行程序test。

    g++ test.o -o test
    

    在命令行窗口中,执行./test,即可输出:

    9
    Hello world!
    

    5.多个文件的编译

    6.库文件连接

    7.g++与gcc的联系和区别

  • 相关阅读:
    Socket_leaks open socket #5024 left in connection
    阿里云 如何减少备份使用量? mysql数据库的完整备份、差异备份、增量备份
    一个正则式引发的血案 贪婪、懒惰与独占
    linux下tmp目录里很多php开头的文件
    后端线上服务监控与报警方案
    架构先行
    数据盘缩容
    文件过滤 批量删除
    mock数据(模拟后台数据)
    如何避免升级 Linux 实例内核后无法启动
  • 原文地址:https://www.cnblogs.com/zhbzz2007/p/5474175.html
Copyright © 2020-2023  润新知