zoukankan      html  css  js  c++  java
  • GCC的编译过程和链接

    GCC编译过程

    • 一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)、和连接(linking)才能变成可执行文件。

    504ba0de-6705-45b6-b029-5d426b7e5b06

    gcc的常用选项

    -E 只预处理,不会编译、汇编、链接

    -S 编译到汇编语言不进行汇编和链接 

    -c 编译和汇编,不会链接

    -o 指定输出文件名为file,这个名称不能跟源文件名同名

    -static 此选项对生成的文件采用静态链接 

    -g 生成调试信息,GNU调试器可利用该信息。

    -share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

    -O0

    -O1

    -O2

    -O3 编译器的优化选项的4个级别,-O0表示没有优化-O1为缺省值,-O3优化级别最高 

    -w 不生成任何警告信息。

    -Wall 生成所有警告信息.

    以hello.c为例:

    #include <stdio.h>
    #define   MAX  20 
    #define   MIN  10 
    #define  _DEBUG
    #define   SetBit(x)  (1<<x) 
    
    int main(int argc, char* argv[])
    {
        printf("Hello World 
    ");
        printf("MAX = %d,MIN = %d,MAX + MIN = %d
    ",MAX,MIN,MAX + MIN); 
    #ifdef _DEBUG
        printf("SetBit(5) = %d,SetBit(6) = %d
    ",SetBit(5),SetBit(6));
        printf("SetBit( SetBit(2) ) = %d
    ",SetBit( SetBit(2) ));        
    #endif
        return 0;
    }

    预处理

    • 预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。

    命令为:

    gcc -E -o hello.i hello.c

    a324486a-cb17-423e-8f1a-884ed449109d

    编译

    • 编译就是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码。

    命令是:

    gcc -S -o hello.s hello.i

    d1db4031-01b8-46cd-9fef-fcc507aac2cd

    汇编

    • 汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)。

    673c56b8-b8be-4ef2-a6c5-99f1acb66777

    命令是:

    gcc -c -o hello.o hello.s

    链接

    • 链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

    03aba40f-defd-4055-9cde-ccd0454315d5

    命令是:

    gcc -o hello hello.o

    总结

    在编译过程中。除非使用了"-c",“-S”,或"-E"选项(或者编译错误阻止了完整的过程),否则统一完整链接步骤。

    譬如:gcc hello.c 和gcc -o hello hello.c都已经完成链接操作。

    90f9f1a2-39d1-46a2-b202-0bb41b5f1cf4

  • 相关阅读:
    Oracle时间日期操作
    c# 语音卡控制语音卡实现电话录音
    ORACLE日期时间函数大全
    oracle的表分区
    如何应付表数据过大的查询问题?(如何尽量避免大表关联)[转]
    优化SQL Server数据库
    oracle知识回顾
    增强现实 artoolkit
    高负载系统架构设计
    三套.net支持库
  • 原文地址:https://www.cnblogs.com/WindSun/p/11191464.html
Copyright © 2011-2022 走看看