我希望我的 C++ 程序包含一个“--version”选项,它会导致它打印出来:
- 为其编译的架构
- 源版本(例如,v0.1.0)
- 应用程序名称
我也是第一次使用 autoconf/automake,我注意到 configure.ac 既有二进制文件又有版本。它目前没有架构信息,我不想添加这样的信息,因为我将在多个拱门下编译。
有没有一种简单的方法可以自动在头文件或源文件中插入版本/架构/应用程序名称信息?大多数 C++ 程序员如何做到这一点?
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
的平台,以及软件将在其中运行的平台。
(除非您正在交叉编译或构建交叉编译工具链,否则这些都是相同的。)
编写一个 python 脚本来生成你的版本源文件。然后通过您使用的任何构建脚本/工具使其运行。
选择一个规则来实际重写版本文件并在 python 脚本中执行它:它实际上取决于您正在执行的项目类型和发布组织。
在我的家庭项目中,我使用一个脚本,每次构建时都会生成一个版本文件,因为我需要知道计算机开发人员在什么时间构建了版本。
但是在很多工作中,我使用了一个生成版本文件的脚本,但前提是我想要它。那是因为开发团队决定了特定版本何时是“发布”。
我建议使用 Python 脚本,因为 Python 可以在所有开发平台上运行,并且在处理文本文件时非常强大且简单。然后可以由您使用的任何构建系统(Visual Studio、CMake 等)调用它。