在程序代码中编码/嵌入版本号的正确方法

Bar*_*uda 13 c++ linux bash gnu version

我想将我的软件版本嵌入到我的代码中,然后使用类似-vor之类的命令从程序二进制文件中检索它--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.
Run Code Online (Sandbox Code Playgroud)

是否有约定或标准这样做?我试图搜索这些信息,但由于我不知道正确的术语,我的搜索仅导致版本控制howto.软件代码是用C++语言编写的,如果它有助于更​​好地解决问题.

Mik*_*son 14

通常,对于主要版本号和次要版本号(如在1.2中,1是主要版本而2是次要版本),它们通常直接在代码中编写,通常作为#define(因为您可能需要它们用于条件编译,即#if块) .

您通常会有一个单独的标头,它只包含那些定义,而不包含任何其他标头(标头保护除外),以最大限度地减少依赖关系.

有些人使用构建系统(如cmake)从版本控制(git,svn,cvs等)中提取版本号,然后将该版本号放入其"版本"标题中.或者,他们将版本号放入构建系统配置文件中,然后将其放在标题上,如cmake教程所示.就个人而言,我不喜欢这种方法,因为它往往会过于频繁地修改您的头文件,并导致频繁和毫无意义的重新编译.

我更喜欢在头文件中编写版本号,然后从头文件中将这些版本号(major,minor,..)拉出到构建系统中.这是cmake可以轻松做到的另一件事.

如果要在软件中嵌入日常版本号(例如内部版本号或修订版号),则不应将其作为#define头文件中的文件编号,而应将其作为您在一个文件中extern const定义的变量. cpp文件.例如,您可以使用cmake从版本控制系统中提取修订版号,将其添加到定义此extern const int revision;变量的cpp文件(通过cmake的configure_file函数),并将程序与该cpp/object文件链接.这样,每次重新构建时,修订号都会自动内置到程序中,并且每次更新时都不会触发完全重新编译(在每次提交时都会触发).

关键是主要版本号和次要版本号的频率变化不足以要求任何类型的自动维护,但您只需要在一个地方手动编写它们,并自动将它传播到可能相关的其他地方(我建议那样做)这个地方是头文件本身).它只是需要完全自动化的修订版或内部版本号(由版本控制生成,并在其他任何地方自动传播).

  • "我更喜欢在头文件中编写版本号,然后将这些版本号从头文件中提取到构建系统中." 你有没有机会扩展你的CMake如何做到这一点? (7认同)

Gáb*_*yal 6

我相信习惯上将版本号保存在专用的头文件中。一些工具可以自动为你生成这个。

例如,请参阅CMake 教程中的“添加版本号和配置的头文件”部分。