2

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

  • 为其编译的架构
  • 源版本(例如,v0.1.0)
  • 应用程序名称

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

有没有一种简单的方法可以自动在头文件或源文件中插入版本/架构/应用程序名称信息?大多数 C++ 程序员如何做到这一点?

4

2 回答 2

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的平台,以及软件将在其中运行的平台。
(除非您正在交叉编译或构建交叉编译工具链,否则这些都是相同的。)

于 2010-01-19T21:38:34.310 回答
1

编写一个 python 脚本来生成你的版本源文件。然后通过您使用的任何构建脚本/工具使其运行。

选择一个规则来实际重写版本文件并在 python 脚本中执行它:它实际上取决于您正在执行的项目类型和发布组织。


在我的家庭项目中,我使用一个脚本,每次构建时都会生成一个版本文件,因为我需要知道计算机开发人员在什么时间构建了版本。

但是在很多工作中,我使用了一个生成版本文件的脚本,但前提是我想要它。那是因为开发团队决定了特定版本何时是“发布”。

我建议使用 Python 脚本,因为 Python 可以在所有开发平台上运行,并且在处理文本文件时非常强大且简单。然后可以由您使用的任何构建系统(Visual Studio、CMake 等)调用它。

于 2010-01-19T20:12:05.113 回答