zoukankan      html  css  js  c++  java
  • Linux C编程学习之开发工具1---GCC编译器

    GCC简介

      GCC(GNU Compiler Collection)是一套功能强大、性能优越的编程语言编译器,它是GNU计划的代表作品之一。GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑 Mac OS X操作系统的标准编译器

      除了支持C,还支持C++、Java

    GCC常用选项

    1. 基本选项

    类型 说明
    -E 预处理后即停止,不进行编译、汇编及连接
    -S 编译后即停止,不进行汇编及连接
    -c 编译或汇编源文件,但是不进行连接
    -o file 指定输出文件为 file

      例子:

        gcc -E -o test.i test.c  将test.c 文件编辑(-E 说明预处理后即停止,不进行编译、汇编及连接),然后将预处理之后的输出输出到 test.i(通过 -o 说明)

        gcc -S -o test.s test.i  将上一步的预处理得到的文件 test.i 进行编译成汇编语言的文件test.s

        gcc -c test.s -o test.o  将上一步的汇编文件,编译成目标文件,但是不进行连接(所以是不能执行的)

        gcc -o test test.o  将上一步编译的目标文件进行连接,生成可执行文件 test

      上面的这种方式从预处理、汇编、连接一步一步走下来,但是在真实的开发环境中是一步从 .c源文件编译成可执行文件的:gcc -o test test.c

     

    2.警告选型、

      在编译程序的过程中,编译器的报错和警告信息对于程序员来说是非常重要的。GCC 包含了完整的出错检查和警告提示功能,它们可以帮助Linux  程序员尽快找出错误的或者潜在的错误代码,从而写出更加专业和优美的代码

    类型 说明
    -Wall 启动所有警告信息
    -Werror 在发生警告时取消编译操作,即将警告看作是错误
    -w 禁用所有警告信息

      例子: gcc -Wall -o test test.c  在编译test.c文件的时候显示所有的警告信息

     

    3.优化选项

      -O0:不进行优化处理

      -O或者-O1:进行基本优化,这些优化在大多数情况下会使程序执行的更快

      -O2:除了完成-O1级别的优化外,还要一些额外的调整工作,比如处理器指令调度等,这是GNU发布软件的默认优化级别

      -O3:除了完成-O2级别的优化外,还进行循环的展开以及其他一些与处理器特性相关的优化工作

      -Os:生成最小的可执行文件,主要用在嵌入式领域

      一般来讲,优化的级别越高,生成的可执行文件的运行速度越快,但是消耗在编译上的时间就越长,因此在开发的时候尽量不要使用优化选项,在软件发行或者开发结束的时候才考虑对代码进行最终的优化。 建议使用-O2

      这里介绍一个测试程序执行时间的命令:time 可执行文件(例如:time ./test),将会显示类似如下的信息

    real    0m1.206s    //总的执行时间(包括进程的调度和切换)
    user   0m1.172s    //用户态执行的时间
    sys     0m0.018s    //内核态执行的时间
    

      

    4.连接器选项

      头文件:主要包含函数的声明部分,不包括函数的具体定义

      库文件:函数的具体实现是在库文件中完成的

        静态库文件:编译链接时,静态库文件的源码全都添加到可执行文件中,运行时就直接使用,但是生成的可执行文件一般比较大(静态库文件的后缀是 .a)

        动态库文件:编译链接时,动态库文件的并不将源码添加到可执行文件中,而是在程序执行时由运行时的连接文件加载动态库文件,这样就更省系统开销。(动态库文件的后缀是 .so)

    类型 说明
    -Idirectory 向GCC的头文件搜索路径中添加新的目录
    -Ldirectory 向GCC的库文件搜索路径中添加新的目录
    -llibrary 提示连接程序在创建可执行文件时包含指定的库文件,例如-lm表示连接到指定的math库
    -static 强制使用静态链接库,因为默认是使用动态链接库的
    -shared 生成动态库文件

      例子:(文件名是 test.c)

    #include<stdio.h>
    #include<math.h>
    int main()
    {
        int i=1;
        printf("%d", sin(i));
        return 0;
    }
    

      使用 gcc -o test test.c 编译源代码,但是在连接程序时出现错误,所以不能正确编译

      主要是因为在C语言中,默认情况下只会连接C 语言的标准库(标准库的路径是 /usr/lib/libc.so),但是 头文件 math.h 所对应的库文件并不在标准库中,而是在 /usr/lib/libm.so,所以需要显式指定。

      所以应该使用这个命令:gcc -o test test.c /usr/lib/libm.so 。这样就可以编译通过

      或者使用 gcc -o test test.c -lm。 这里面-lm 选项就是表示指定 math库

    5.其他选项

    类型 说明
    -x language 指定输入文件的编程语言(默认gcc 是根据源文件的后缀识别源文件的,但是也可以通过 -x强制显式指定)
    -v 显示编译器的版本号
    -g 获得有关调试程序的详细信息,需要结合gdb 一起使用,参见下一篇博客
    -ansi 支持符合ANSI标准的C程序



  • 相关阅读:
    第二章、Java内存区域与内存溢出异常
    第二章、Java内存区域与内存溢出异常
    腾讯//格雷编码
    腾讯//格雷编码
    数据结构5.5_广义表的递归算法
    数据结构5.4_m元多项式的表示
    数据结构4.2_串操作应用举例_建立词索引表
    数据结构3_栈和队列
    数据结构2_线性表
    数据结构1_绪论
  • 原文地址:https://www.cnblogs.com/xumenger/p/4510033.html
Copyright © 2011-2022 走看看