首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU autotools:调试/发布目标?

GNU autotools:调试/发布目标?
EN

Stack Overflow用户
提问于 2010-12-29 19:37:31
回答 4查看 46.3K关注 0票数 74

我寻找这个已经有一段时间了:我目前正在将一个中等大小的程序转换为autotools,它来自一个基于Eclipse的方法(带有makefile)

我总是习惯于有一个“调试”构建,包含所有调试符号,没有优化,以及一个“发布”构建,没有调试符号和最佳优化。

现在我正尝试用autotools以某种方式复制它,这样我就可以(也许)做一些类似的事情:

代码语言:javascript
复制
./configure
make debug

它将具有所有调试符号而不进行优化,并且其中:

代码语言:javascript
复制
./configure
make

将导致"release“版本(默认)

PS:我读过关于--enable-debug标志/特性的文章,但是在我当前的(简单)设置中,configure无法识别它的使用

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-29 19:46:44

configure.inconfigure.ac文件中添加一个子句;

代码语言:javascript
复制
AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])

AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

现在在你的Makefile.inMakefile.am中;

代码语言:javascript
复制
if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif

因此,在启用debug时,您可以修改{C/CXX}FLAGS以启用调试信息。

票数 17
EN

Stack Overflow用户

发布于 2011-01-13 21:31:43

ismail的解决方案是一种常见的方法,但它存在一些严重的问题。如果用户尝试通过执行“./ configure --enable- debug”来获取调试版本,则配置脚本将把CFLAGS设置为“-g -O2”,并且Makefile在构建任何可执行文件时将使用“-g3 -O0 ... -g-O2”。在这种情况下,gcc将使用-O2,并且一些编译器将因为-O选项冲突而中止。这两种情况都不是预期的行为。

使用调试符号或不使用调试符号进行构建根本不是项目维护者应该担心的事情,。这对用户来说是一个问题。如果要生成项目,并且希望生成调试生成或发布生成,则应在配置时使用不同的选项。例如,

代码语言:javascript
复制
$ mkdir debug
$ mkdir release
$ cd debug && /path/to/configure --prefix=/dbg \
   CPPFLAGS=-DDEBUG CFLAGS="-g -O0" && make && make install
$ cd ../release && /path/to/configure CPPFLAGS=-DNDEBUG && make && make install

这将在/dbg/bin中安装一个带有‘-DDEBUG’和'-g -O0‘(“调试版本”)的版本,并在/usr/local/bin中安装一个'release’版本

通过使用CONFIG_SITE文件,可以减少必要的输入工作。例如,您可以执行以下操作:

代码语言:javascript
复制
echo 'CPPFLAGS=-DDEBUG CFLAGS="-g -O0"' >> /dbg/share/config.site

然后,所有将来调用'configure --prefix=/dbg‘都会自动将这些设置继承到CPPFLAGS和CFLAGS,而无需在命令行中指定。

作为包的维护者,如果您想为用户提供一种构建“调试版本”的简单方法,那么在发行版中包含一个脚本,该脚本使用适当的参数调用配置脚本并调用make && make install,这是完全可以接受的,但绝对没有必要将您的自动工具元文件弄得乱七八糟。它根本不属于那里。需要注意的是,许多软件包都试图添加--enable-debug,但这是完全错误的。如果用户调用了configure CFLAGS="-g -O0",但是得到了一个应用了意外标志的构建,那么您就有了一个bug,您的包就是损坏的。这是一种非常常见的体验,如果您维护一个包(当前正在考虑tmuxcurl),在这个包中,用户在调用configure CFLAGS="-g -O0"之后没有得到任何合理的人都会称之为“调试构建”的东西,那么您的包就是broken

在使用autotools维护包时,必须始终记住的重要一点是,用户使用的工具链可能与您完全不同。用户的工具链完全有可能需要-DMAKE_IT_A_DEBUG-DUSE_DEBUG-I/non/standard/path/to/headers。也许它需要将-O145-Q传递给编译器,或者将-debug传递给链接器,或者...什么都行。作为维护者,您根本没有必要的信息来使短语"debug build“对所有用户都有意义。因此,不要尝试,因为您可能会使软件对于特定的用户组不可构建。

票数 163
EN

Stack Overflow用户

发布于 2012-01-04 20:13:05

使用autotools创建的默认Makefile会生成带有debug symbos的二进制文件。使用make install-strip生成发布目标。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4553735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档