美文网首页
c语言编译全过程(GCC)

c语言编译全过程(GCC)

作者: UNCOM | 来源:发表于2018-12-24 19:51 被阅读0次

    介绍

    如果您是c语言程序员避免不了要使用gcc编译您的源程序,下面就介绍一下一个c语言源文件怎么使用gcc加工成可执行程序

    c语言编译过程

    预处理 ---> 编译 ---> 汇编 ---> 连接

    如果您写好了一个c语言源文件,那么此时需要用编译程序将它处理成可执行文件。处理的过程分别是:

    • 预处理:将源程序进行预处理替换,比如 #include xxx 会用xxx文件的内容替换到源程序中
    • 编译:将预处理好的源文件编译成目标文件,此时不是二进制文件(中间产物)
    • 汇编:将源程序翻译成汇编语言(中间产物)
    • 连接:将库、目标文件等中间产物连接到一起,生成最终的二进制可执行文件

    中间的过程稍有些复杂,这里简单的介绍一下:

    • 根据不同系统不同编译器,处理的过程是不同的
    • 有些系统编译和连接是分开的,需要分两步进行
    • 像预处理和汇编等都是中间处理过程的产物,程序员只需要在用到时将它们输出即可
    • gcc编译器可以用不同参数分别给出您想要的结果

    gcc 常用参数的简要说明

    源文件或生成文件后缀名 使用参数生产前面的文件 说明 备注
    .c (小写) 用编辑器敲出来的文本文件,C语言的源文件
    .o (小写) -c (小写) 只编译源文件,生成的目标文件(自动生成) 加 -o (小写) xxx.o 可以生成相应名字的文件
    .i -E 只进行预处理,默认打印到屏幕上 加 -o (小写) xxx.i 可以生成相应名字的文件
    .s (小写) -S (大写) 生成汇编文件,默认自动生成 加 -o (小写) xxx.s 可以生成相应名字的文件
    -g 生成用于 dbg 可调试的文件
    -O -O2 (大写) 不同等级的优化程序
    -std=c99 某些编译器激活c99特性
    -static 禁止使用共享连接
    -shared 生成共享目标文件。通常用在建立共享库时
    -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词
    -w 不生成任何警告信息
    -Wall 生成所有警告信息
    # 范例:
    gcc xxx.c     # 会直接生产一个 a.out 的可执行程序,-o 参数可以改名
    gcc -c xxx.c  # 生成一个 xxx.o 的目标文件
    gcc -E xxx.c  # 在屏幕上打印预处理后的文件
    gcc -E xxx.c -o xxx.i # 将生成 xxx.i 的文件,-o 参数可以生成不同名字 如:-o zzz.i
    gcc -S xxx.c  # 自动生成 xxx.s 的汇编文件,-o 参数可以改名
    # 一般来说 -o 参数就是将生成的内容以不同名字保存成文件
    # 如果需要用 gdb 进行调试需要添加 -g 参数
    

    gcc 如何查找文件路径

    gcc在编译连接时需要找到头文件或库文件,那么是如何找到的呢

    • 首先要从 -I 参数开始找,自己给定的
    • 然后寻找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
    • 接下来从默认的路径中寻找
    /usr/include
    /usr/local/include
    /usr/lib/gcc-lib/i386-linux/2.95.2/include
    /usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/include/g++-3
    /usr/lib/gcc-lib/i386-linux/2.95.2/……/……/……/……/i386-linux/include
    # 如果装gcc的时候,是有给定的prefix的话,那么就是
    /usr/include
    prefix/include
    prefix/xxx-xxx-xxx-gnulibc/include
    prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
    
    • 那么如何手动指定路径呢
    # 例:
    gcc -o hello hello.c -l /home/hello/include -L /home/hello/lib -lworld
    # 上面的这句话是在编译hello时
    
    # -l /home/hello/include 表示:
    # /home/hello/include 目录作为第一个寻找头文件的目录。
    # 寻找的顺序是 /home/hello/include --> /usr/include --> /usr/local/include
    
    # -L /home/hello/lib 表示:
    # /home/hello/lib 目录作为第一个寻找库文件的目录。
    # 寻找的顺序是 /home/hello/include --> /lib --> /usr/lib --> /usr/local/lib
    
    # -lworld 表示:
    # 在上面的路径中寻找 libworld.so 动态库文件。
    # 如果 gcc 编译选项中加入了 -static 则表示寻找 libworld.a 静态文件库。
    

    结束

    相关文章

      网友评论

          本文标题:c语言编译全过程(GCC)

          本文链接:https://www.haomeiwen.com/subject/ructlqtx.html