• Linux gcc编译参数


    最近编译一份开源代码,一编译就直接报错。我看了下报错信息,有点诧异。这些信息,放平常顶多就是个warnning而已啊,他这里怎么变成了error呢?我看了下Makefile,发现编译参数多了个-Werror,难道是这个参数的原因。果断百度了一把。百度帮我找到了这篇CSDN的好文:《Linux系统平台下关于GCC编译及使用的方法 (-Werror,它要求GCC将所有的警告当成错误进行处理 ) 》。所以我赶紧学习一下。

        编译

          预编译

    第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程。比如:

    gcc -E hello.c -o hello.i

    预处理的宏定义插入到hello.i中。

          目标代码

    第二步是将hello.i编译为目标代码,这可以通过使用-c参数来完成。比如:

    gcc -c hello.i -o hello.o

    也可以通过源文件直接生成:gcc -c hello.c

           可执行文件

    第三步是将生成的目标文件链接成可执行文件,比如:

    gcc hello.o -o hello

    也可以通过源文件直接生成:gcc -o hello hello.c

        警告(warning)

    1、-pedantic 选项,那么使用了扩展语法的地方将产生相应的警告信息。

    2、-Wall 使用它能够使GCC产生尽可能多的警告信息。

    3、-Werror,它要求GCC将所有的警告当成错误进行处理。所以如果我们对自己的代码提高要求的话,就尽量加上这个参数吧。warning也不要放过。

    4、-w,这个和Werror刚好相反,它将禁止所有的报警。慎用。

        库依赖

          默认寻址

    1、Linux下的大多数函数都默认:

    头文件放到/usr/include/目录下。

    而库文件则放到/usr/lib/目录下。

          自定义寻址

    1、GCC在编译时可以自定义查找所需要的头文件和库文件。

    -I选项可以向GCC的头文件搜索路径中添加新的目录。

    例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I选项:

    gcc -o test test.c -I /home/xiaowp/include

    -L选项向GCC的库文件搜索路径中添加新的目录

    例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让GCC能够顺利地找到它,可以使用下面的命令

    gcc -o test test.c -L /home/xiaowp/lib -lfoo

    值得好好解释一下的是-l选项,它指示GCC去连接库文件libfoo.so。

    Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说GCC在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件。

    -static选项,强制使用静态链接库

    如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a。为了让GCC在链接时只用到静态链接库,可以使用下面的命令:

    gcc -o test test.c -L /home/xiaowp/lib -static -lfoo

           编译优化

              优化参数

    选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。

    在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。

    选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。

    选项-O3则除了完成所有-O2级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。

    通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。

    许多Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。

            优化注意事项

    优化虽然能够给程序带来更好的执行性能,但在如下一些场合中应该避免优化代码:

    一、程序开发的时候优化等级越高,消耗在编译上的时间就越长,因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候,才考虑对最终生成的代码进行优化。

    二、资源受限的时候一些优化选项会增加可执行代码的体积。如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。

    三、跟踪调试的时候在对代码进行优化的时候,某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组,从而使跟踪和调试变得异常困难。

          编译加速

    -pipe 加速编译,使用管道代替编译中临时文件。

    gcc -pipe foo.c -o foo

    如果是Makefile的方式,而机器又是多核的,还可以加上-j参数。比如我的机器是8核,那就可以这样加快编译速度。

    make -j8

         gcc常用选项

    -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件;

    -Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验;

    -E 不经过编译预处理程序的输出而输送至标准输出;

    -g3 获得有关调试程序的详细信息,它不能与-o选项联合使用;

    -Idirectory 在包含文件搜索路径的起点处添加指定目录;

    -llibrary 提示链接程序在创建最终可执行文件时包含指定的库;

    -O、-O2、-O3 将优化状态打开,该选项不能与-g选项联合使用;

    -S 要求编译程序生成来自源代码的汇编程序输出;

    -v 启动所有警报;

    -Wall 在发生警报时取消编译操作,即将警报看作是错误;

    -Werror 在发生警报时取消编译操作,即把报警当作是错误;

    -w 禁止所有的报警。

  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/kex1n/p/6651023.html
Copyright © 2020-2023  润新知