• autoconf添加gcc调试选项


     
    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的选项来控制编译出的可执行文件是否带有调试信息了。

  • 相关阅读:
    Business Objects 基础
    常用的bw基础知识
    SAP BW传输请求操作步骤
    FI/CO 财务基础知识
    SAP财务常用数据源概览
    HANA 和 SAP NetWeaver BW
    Request.QueryString中文乱码
    完全备份类型
    SQL Server备份属于I/O密集型操作
    SQL Server 通过发布订阅 实现数据库同步
  • 原文地址:https://www.cnblogs.com/hellogc/p/3219609.html
Copyright © 2020-2023  润新知