cpf*_*cpf 58 c++ automake autoconf autotools
我一直在寻找这个:我目前正在将一个中型程序转换为autotools,来自基于Eclipse的方法(带有makefile)
我总是习惯于进行"调试"构建,包含所有调试符号和没有优化,以及"发布"构建,没有调试符号和最佳优化.
现在我试图用autotools以某种方式复制它,所以我可以(也许)做类似的事情:
./configure
make debug
Run Code Online (Sandbox Code Playgroud)
哪个会有所有调试符号而没有优化,以及哪里:
./configure
make
Run Code Online (Sandbox Code Playgroud)
会导致"发布"版本(默认)
PS:我已经阅读了关于--enable-debug标志/功能的内容,但在我目前的(简单)设置中,使用它无法识别 configure
Wil*_*ell 133
ismail的解决方案是一种常见的方法,但它遇到了一些严重的问题.如果用户通过执行'./configure --enable-debug'尝试获取调试版本,则configure脚本会将CFLAGS设置为'-g -O2',Makefile将使用'-g3 -O0 ... -g -O2'构建任何可执行文件时.在这种情况下,gcc将使用-O2,并且由于冲突的-O选项,一些编译器将中止.这两种情况都不是预期的行为.
是否使用调试符号构建项目并不是项目维护者应该担心的问题.这是用户的问题.如果您有项目并且想要进行调试构建或发布构建,则应在配置时使用不同的选项.例如,
$ 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
Run Code Online (Sandbox Code Playgroud)
这将在/ dbg/bin中安装调试版本,在/ usr/local/bin中安装"release"安装
此外,您可以使用CONFIG_SITE文件大大减少必要输入的繁琐.例如,你可以这样做:
echo 'CPPFLAGS=-DDEBUG CFLAGS="-g -O0"' >> /dbg/share/config.site
Run Code Online (Sandbox Code Playgroud)
然后所有'configure --prefix =/dbg'的调用将自动继承CPPFLAGS和CFLAGS的设置,而无需在命令行中指定.
如果作为软件包维护者,您希望为用户提供一种简单的方法来构建"调试版本",那么在分发中包含一个脚本是完全可以接受的,该脚本使用适当的参数调用configure脚本并调用make && make install,但是绝对没有必要乱丢你的autotool元文件.它根本不属于那里.并且要注意,许多软件包已经尝试添加--enable-debug哪些是完全错误的.如果用户调用configure CFLAGS="-g -O0"但获得了一个应用意外标志的构建,那么您就会遇到错误,并且您的软件包已损坏.这是一个非常常见的体验,如果您维护一个包(当前正在考虑tmux和curl),其中用户没有得到任何合理的人在调用后称为"调试版本" configure CFLAGS="-g -O0",那么您的包将被破坏.
在使用autotools维护包时必须始终记住的一个重点是用户可能正在使用与您完全不同的工具链.用户的工具链完全可能需要-DMAKE_IT_A_DEBUG或-DUSE_DEBUG或-I/non/standard/path/to/headers.也许它需要-O145或-Q传递给编译器或-debug传递给链接器,或者......任何东西.作为维护者,您根本没有必要的信息来使"调试构建"这一短语对所有用户都有意义.因此,请不要尝试,因为您可能会使某些用户无法构建该软件.
ism*_*ail 18
在您的configure.in或configure.ac文件中添加一个子句;
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")
Run Code Online (Sandbox Code Playgroud)
现在在你Makefile.in或Makefile.am;
if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif
Run Code Online (Sandbox Code Playgroud)
因此,debug启用后,您可以修改您{C/CXX}FLAGS的启用调试信息.
| 归档时间: |
|
| 查看次数: |
38973 次 |
| 最近记录: |