将版本和arch信息插入C ++源代码的最佳方法是什么?

时间:2010-01-19 20:10:21

标签: c++ version autoconf automake

我希望我的C ++程序包含一个“--version”选项,使其打印出来:

  • 编译的架构
  • 源的版本(例如,v0.1.0)
  • 申请名称

我也是第一次使用autoconf / automake,我注意到configure.ac同时包含二进制文件和版本。它目前没有架构信息,我不想添加这样的信息,因为我将在多个拱门下进行编译。

是否有一种简单的方法可以自动在标头或源文件中插入version / arch / appname信息?大多数C ++程序员如何做到这一点?

2 个答案:

答案 0 :(得分:4)

autoconf为您提供config.h,其中提供了字符串宏,例如PACKAGEPACKAGE_NAMEPACKAGE_STRINGPACKAGE_VERSIONVERSION

(当我使用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等)调用它。