• 如何去除configure的默认选择-g O2


    http://lists.gnu.org/archive/html/autoconf/2006-04/msg00002.html

    http://www.linuxidc.com/Linux/2013-07/87257.htm

    autoconf生成的编译选项默认是"-g -O2"。这个"-g"选项将我迷惑了,以为生成了GDB调试所需的信息,所以也就没有管后面的"-O2“选项。

    实际上在用GDB进行调试的时候,单步跟踪代码,GDB显示的代码非常混乱。要么某些代码行未显示,要么中间插入了很多看起来像库函数的代码。甚至有时检查变量值都不对,但是根据此变量生成的后续结果却是正确的。

    查看GCC文档,发现-g与-O选项虽然允许同时使用,但是会产生"surprise”的结果。

    为了方便开发阶段的调试工作,需要给autoconf添加一个调试选项来控制其生成的编译选项。这可以通过在configure.ac中使用AC_ARG_ENABLE宏来实现。

    AC_ARG_ENABLE宏的格式为:
        AC_ARG_ENABLE(feature, help-string, [action-if-given], [action-if-not-given])

    在configure.ac中添加如下配置:

    # enable debug or not                                                         
    AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [enable DEBUG mode(default=no)]),
                  [],                                                           
                  [enable_debug=no])                                             
    AS_IF([test "x$enable_debug" = "xyes"], [CXXFLAGS="-g2 -O0 -DDEBUG -Wall"],       
        [test "x$enable_debug" = "xno"], [CXXFLAGS="-O2 -Wall"],                 
        [])        

    上面配置的意思是:给最后生成的configure脚本添加一个--enable-debug选项,如果指定了此选项,则CXXFLAGS="-g2 -O0 -DDEBUG -Wall",否则CXXFLAGS="-O2 -Wall"。

    每一个enable选项都有一个enable_feature变量与之对应,可以通过此变量取得用户指定的值。以上面的场景为例:
    (1)如果指定--enable-debug,不带参数,则enable_debug变量值为"yes"。
    (2)如果指定--enable-debug=no,则enable_debug变量值为"no"。
    (3)如果指定--disable-debug,则与--enable-debug=no效果相同。

    AS_IF宏与C语言中的if语句功能相似,格式为:
        AS_IF (test1, [run-if-true1], . . . , [run-if-false])

    例:
    AS_IF([test "x$foo" = xyes], [HANDLE_FOO([yes])],
            [test "x$foo" != xno], [HANDLE_FOO([maybe])],
            [echo foo not specified])


    AS_IF的行为是:首先检查第一个条件,如果成立,执行相应操作;如果第一个条件不成立,继续检查下一个条件;如果所有条件都不成立,则执行run-if-false。

    添加了debug选项以后,执行./configure --help可以看到我们指定的文档字串:
     --enable-debug          enable debug mode(default=no)

    这样我们就可以通过configure的选项来控制编译出的可执行文件是否带有调试信息了。

  • 相关阅读:
    用Android Studio 开发Android应用
    以前写的一个下载小说的工具
    折半算法的C#实现方式-递归和非递归
    128. 最长连续序列
    一语点醒技术人:你不是 Google(转载)
    计算机专业导论与思维系统--哈工大
    安卓笔记 09_28
    安卓学习笔记
    安卓数据库08_29
    08_28学习笔记Kotlin
  • 原文地址:https://www.cnblogs.com/tfanalysis/p/4093400.html
Copyright © 2020-2023  润新知