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的選項來控制編譯出的可執行文件是否帶有調試信息了。