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

autoconf添加gcc调试选项的更多相关文章

  1. GCC(警告.优化以及调试选项)

    GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器   gcc/g++在执行编译工作的时候,总共需要4步   1.预处理,生成.i的文件 预处 ...

  2. GCC笔记(警告.优化以及调试选项)

    GCC提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告: -Waddress -Warray-bounds (only with -O2) -Wc++0x-c ...

  3. gcc及其选项详解 【转载】

    1.简介: gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一起分发的.这个东西功能强大,但是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时很少用到.但是不管装软件还是写程序 ...

  4. VSCode调试Html中的脚本 vscode前端常用插件推荐,搭建JQuery、Vue等开发环境 vsCode 添加浏览器调试和js调试的方法总结 VS Code - Debugger for Chrome调试js

    一.背景 使用Visual Studio Code写了一个简单的Html页面,想调试下其中script标签里的javascript代码,网上查了一通,基本都是复制粘贴或者大同小异的文章,就是要安装De ...

  5. gcc及其选项详解

    1.简介: gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一起分发的.这个东西功能强大,但是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时很少用到.但是不管装软件还是写程序 ...

  6. gcc options选项的优化及选择

    gcc options选项的优化 -c和-o都是gcc编译器的可选参数[options] -c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件.[只 ...

  7. 让configure和cmake编译时支持调试选项

    在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式.它们生成的makefile文件,一般默认不支持-g调试选项.但我们使用这 ...

  8. ecshop后台增加|添加商店设置选项和使用方法详解

    有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...

  9. [转载]在Android C/C++层添加LOG调试

    原文地址:C/C++层添加LOG调试">在Android C/C++层添加LOG调试作者:谢轩昂 在Android C/C++层添加LOG调试,并且在Logcat中输出的方法 第一步: ...

随机推荐

  1. ES6对象扩展

    前面的话 随着JS应用复杂度的不断增加,开发者在程序中使用对象的数量也在持续增长,因此对象使用效率的提升就变得至关重要.ES6通过多种方式来加强对象的使用,通过简单的语法扩展,提供更多操作对象及与对象 ...

  2. (转)Java线程:新特征-线程池

    Java线程:新特征-线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利 ...

  3. JS浏览器对象:window对象、History、Location对象、Screen对象

    一.JS浏览器对象-window 1.window对象 window对象是BOM的核心,window对象指当前的浏览器窗口 所有JavaScript全局对象.函数以及变量均自动成为window对象的成 ...

  4. css3关键帧动画实现轮播效果

    实现效果:打开手机京东,可以看到首页的头部,以这个头部为基础,仿写一个类似的样式. 思路:仔细观察可以发现,手机京东的头部是以一个搜索栏和轮播特效组成的,而这个搜索栏是以轮播特效做为背景的,现在运用c ...

  5. c3p0数据库连接池+mysql数据库基本使用方法

           一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接.因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒), 连接就会被自动释放掉. ...

  6. Python LeetCode

    Python不熟悉 不同的做法 404. Sum of Left Leaves 这是我的做法,AC. class Solution(object): res = 0 def recursive(sel ...

  7. seajs的模块化开发--实践笔记

    2017-04-02 SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.有效的解决复杂项目中命名冲突.依赖.性能等问题. SeaJS ...

  8. 在html中使用javascript

    使用script元素,script6个元素 1.async:应该立即下载 2.charset:通过src属性指定代码的字符集 3.defer:表示脚本可以延迟到文档完全解析和显示后运行 4.langu ...

  9. 从.net到java,记录下这三个月的工作

    从事.NET开发已经4个年头,经过十余个项目的学习与沉淀,终于有了一套自己熟悉并且相对完善的技术体系,面对未知,不再惧怕.期间完成并广泛用于公司项目的作品包括: abp的二次开发框架BodeAbp 基 ...

  10. Log4net快速配置使用指南。(快速搭建log4net日志平台手册)

    每做一个新项目,都会用到log4net,但总是忘记如何快速配置.有时在网上搜半天也找不到好的模板,大都在介绍参数的使用,在此做下总结,争取下次用时仅10分钟就可搭建好log4net. 直接上介绍的步骤 ...