我想将我的软件版本嵌入到我的代码中,然后使用像-v
或--version
之类的参数从程序二进制文件中检索它。例如,一些GNU / Linux软件二进制文件在命令行中以-v
或-V
参数提供时打印其版本信息,以ls
为例:
$ ls --version
ls (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
是否有约定或标准?我试图搜索这些信息,但由于我不知道正确的术语,我的搜索只导致了版本控制方法。软件代码是用C ++语言编写的,如果它有助于更好地解决问题。
答案 0 :(得分:14)
通常,对于主要版本号和次要版本号(如1.2中,1为主要版本,2为次要版本),它们通常直接在代码中编写,通常为#define
(因为您可能需要它们)对于条件编译,即#if
块)。
您通常会有一个单独的标头,其中只包含那些定义,而不包含任何其他标头(标头保护除外),以最大限度地减少依赖关系。
有些人使用构建系统(如cmake)从版本控制(git,svn,cvs等)中提取版本号,然后将该版本号放入其“版本”标题中。或者,他们将版本号放入构建系统配置文件中,然后将其放在标题上,如cmake tutorial所示。就个人而言,我不喜欢这种方法,因为它往往会过于频繁地修改您的头文件,并导致频繁和无意义的重新编译。
我更喜欢在头文件中编写版本号,然后从头文件中将这些版本号(major,minor,..)拉出到构建系统中。这是cmake非常容易做到的另一件事。
如果您想在软件中嵌入日常版本号,例如内部版本号或修订版号,那么您不应将其作为#define
放在头文件中,而是作为您在一个cpp文件中定义的extern const
变量。例如,您可以使用cmake从版本控制系统中提取修订版号,将其添加到定义此extern const int revision;
变量的cpp文件中(通过cmake的configure_file
函数),并将程序与cpp / object文件。这样,修订版号会在每次重新构建时自动构建到程序中,并且每次更新时都不会触发完整的重新编译(在每次提交时都是如此)。
关键是主要版本号和次要版本号的频率变化不足以要求任何类型的自动维护,但是您只需要在一个地方手动编写它们,并自动将它传播到可能相关的其他地方(I会建议这个地方是头文件本身)。只有修订版或内部版本号需要完全自动化(由版本控制生成,并在其他地方自动传播)。
答案 1 :(得分:2)
我认为习惯上将版本号保存在专用的头文件中。有些工具可以自动为您生成。例如,以下是如何使用CMake执行此操作: http://www.cmake.org/cmake-tutorial/
请参阅“添加版本号和已配置的头文件”部分