我希望我的C ++程序包含一个“--version”选项,使其打印出来:
我也是第一次使用autoconf / automake,我注意到configure.ac同时包含二进制文件和版本。它目前没有架构信息,我不想添加这样的信息,因为我将在多个拱门下进行编译。
是否有一种简单的方法可以自动在标头或源文件中插入version / arch / appname信息?大多数C ++程序员如何做到这一点?
答案 0 :(得分:4)
autoconf为您提供config.h
,其中提供了字符串宏,例如PACKAGE
,PACKAGE_NAME
,PACKAGE_STRING
,PACKAGE_VERSION
和VERSION
。
(当我使用Argp参数解析器时,我只需使用
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <argp.h>
const char *argp_program_version = PACKAGE_STRING;
const char *argp_program_bug_address = PACKAGE_BUGREPORT;
/* et cetera */
int main(int argc, char **argv) {
error_t argp_result = argp_parse(&argp, argc, argv, 0, 0, NULL);
if (argp_result) return argp_result;
/* et cetera */
}
然后--help
,--version
等只会自动生效。)
你也可以添加
AC_CANONICAL_HOST
AC_DEFINE_UNQUOTED([CHOST], ["$host"], [Canonical host])
AC_CANONICAL_BUILD
AC_DEFINE_UNQUOTED([CBUILD], ["$build"], [Canonical build])
AC_CANONICAL_TARGET
AC_DEFINE_UNQUOTED([CTARGET], ["$target"], [Canonical target])
如果您想在configure.ac
中添加这些字符串宏,请到config.h
。这些通常是$arch-$vendor-$kernel-$libc
形式的字符串,其中为
CHOST
是构建软件后运行的平台,
CBUILD
是目前正在构建软件的平台,以及
CTARGET
是软件将采取行动的平台
(除非您是交叉编译或构建交叉编译工具链,否则它们都是相同的。)
答案 1 :(得分:1)
编写一个生成您的版本源文件的python脚本。然后使用你正在使用的任何构建脚本/工具运行它。
选择一条规则来实际重写版本文件并在python脚本中强制执行:它实际上取决于您正在进行的项目类型和发布组织。
在我的家庭项目中,我使用的脚本每次构建时都会生成一个版本文件,因为我需要知道计算机开发人员是否构建了该版本的版本。
但是在很多工作中我使用了一个生成版本文件的脚本,但只有在我想要的时候。那是因为开发团队决定特定版本何时是“发布”。
我建议使用Python脚本,因为Python在所有开发平台上运行,并且在文本文件操作方面非常强大和简单。然后可以通过您使用的任何构建系统(Visual Studio,CMake等)调用它。