C++笔记从代码到可执行文件的四个阶段

.s文件、.S文件和.o文件的区别 https://blog.csdn.net/hao745580264_dawei/article/details/80751683

.s 汇编语言源程序; 操作: 汇编
.S汇编语言源程序; 操作: 预处理 + 汇编

C++从代码到可执行文件的四个阶段 https://www.cnblogs.com/dreammmz/p/13409800.html

对c程序来说使用
gcc name.c -o name.exe
执行命令后会生成可执行文件 name.exe。
对c++程序来使用
g++ name.cpp -o name.exe
执行命令后生成可执行文件name.exe。

C/C++学习 - gcc编译过程查看汇编代码 https://blog.csdn.net/alps1992/article/details/44737839

参数 说明
-c 只编译不链接,生成*.o文件
-S 生成汇编代码*.s文件
-E 预编译 生成*.i文件
-g 在可执行程序里包含了调试信息,可用 gdb 调试
-o 把输出文件输出到指定文件里
-static 链接静态链接库
-library 链接名为library的链接库

给一段代码


#include <functional>
#include <iostream>
#include <typeinfo>
#include <chrono>

//待封装的函数
int testEfficiency (int i, int j) {
    for (size_t ii = 0; ii < 5; ii++) {
        i += i - ii;
    }
    if (i < j)
        return i + 7 * j;
    else return i - 3 * j;
}


//待封装的函数
int testEfficiency2 (int i, int j) {
    for (size_t ii = 0; ii < 5; ii++) {
        i += i - ii;
    }
    if (i < j)
        return i + 8 * j;
    else return i - 2 * j;
}

typedef std::function<int (int, int) > FuncInt_IntInt;
using funcInt_IntInt = int (*) (int, int);  //函数指针

int main(int argc, char** argv) {
    int a = 1;
    int c = a;
    int testNum = 1E9;
    funcInt_IntInt fFuncPtr = testEfficiency;
    if (false) {
      fFuncPtr = testEfficiency2;
    }

    std::cout << "函数原型类型:\t\t" << typeid (testEfficiency).name() << std::endl;
    std::cout << "函数指针类型:\t\t"  << typeid (fFuncPtr).name() << std::endl;

    std::chrono::time_point<std::chrono::system_clock> start, end;

    // PART-1: 直接调用方法
    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < testNum; i++) {
        a = testEfficiency (a, 2);
    }
    end = std::chrono::system_clock::now();
    std::cout << "直接调用耗时:\t\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;

    // PART-3: 函数指针
    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < testNum; i++) {
        c = fFuncPtr (c, 2);
    }
    end = std::chrono::system_clock::now();
    std::cout << "使用函数指针耗时:\t" << std::chrono::duration<double> (end - start).count() << "秒" << std::endl;

    std::cout << "a=" << a << std::endl;
    std::cout << "c=" << c << std::endl;
}

预处理: 生成.i 文件
g++ -E test_fun_ptr.cpp -o test1b.i -O2

编译: 生成.s文件
g++ -S test1b.i -o test1b.s -O2

汇编: 生成.o文件
g++ -c test.s -O2
g++ -c test.i -O2

链接: 生成可执行文件
g++ test.o -o test -O2

原文地址:https://www.cnblogs.com/gnivor/p/15657309.html