C++ 如何查询二进制';s源代码版本
我的环境是Linux CentOS 6.2。我有一个源代码控制系统,比如svn/hg/git等。我的源代码是C/C++ 我想签入构建二进制文件,以保留向客户发布的二进制文件 我假设当源代码更改时,构建二进制文件的校验和将不同。 所以,我可以反向跟踪哪个二进制文件是从哪个版本生成的 有没有可能,我必须遵循哪些技巧 我看到一些可执行文件在使用-version选项执行时显示修订。 但我想知道如何防止在可执行文件中写入错误版本的字符串 如果我保留一个md5.txt并签入它而不是签入二进制文件。 我如何确保可以再次构建相同的md5可执行文件 对不起,为了澄清我的问题并防止出现另一个意外的答案,我更喜欢这样的答案:C++ 如何查询二进制';s源代码版本,c++,c,linux,version-control,C++,C,Linux,Version Control,我的环境是Linux CentOS 6.2。我有一个源代码控制系统,比如svn/hg/git等。我的源代码是C/C++ 我想签入构建二进制文件,以保留向客户发布的二进制文件 我假设当源代码更改时,构建二进制文件的校验和将不同。 所以,我可以反向跟踪哪个二进制文件是从哪个版本生成的 有没有可能,我必须遵循哪些技巧 我看到一些可执行文件在使用-version选项执行时显示修订。 但我想知道如何防止在可执行文件中写入错误版本的字符串 如果我保留一个md5.txt并签入它而不是签入二进制文件。 我如何确
- 在make时将符号写入二进制(例如by-DVERSION=“1.x”)
- 向用户显示版本字符串
- 删除所有$Id,这会使SCM运行变慢
- 保持相同的CPU、操作系统、编译器和库环境
这是可执行库还是共享库?如果是后者,则可以导出返回版本(数字、字符串、您的选择)的函数。然后dlopen()、dlsym()并执行该函数 对于可执行的ELF二进制文件,您可能能够在二进制文件中植入一些数据,这些数据可以使用“nm”实用程序进行查询
static const char version[]=“@(#)$Id$”代码>
其中$Id$是从SVN获得的
对于Mercurial,您可以从wiki获得版本sting的想法,并且为了获得git Descripte的类似字符串的结果,而不是HGVERSION的简单模板{node | short},您可以使用
{latesttag}+{latesttagdistance}:{node | short}
,显示(示例)1.3+11:8a226f0f99aa
不要签入二进制文件。不,只是不需要。你不需要签入二进制文件。如果您必须记录某些内容,只需检入MD5或SHA1校验和(ASCII格式)。如果您确实检入二进制文件,为什么要检入一个二进制文件,而该二进制文件是从与该二进制文件一起检入的源树以外的任何内容构建的?如果您询问源代码管理系统上一次修改二进制文件的版本,并检查该版本,您应该能够相信该版本包含生成二进制文件的代码。@IgnacioVazquez Abrams-有时检查二进制文件是一个非常好的主意,以确保您使用的是您认为您正在使用的。如果您收到了collegue构建的二进制文件,则这是正确的。我们都会偶尔犯错——这被称为做人。@EdHeal——这并不意味着你必须在VCS中提交二进制文件。您只知道,哪个版本的源代码用于构建二进制文件,@(#)
除了作为hexdumper的可搜索模式之外,还有其他功能吗?我在SunOS上使用了什么命令,但这不是默认的linux命令。即使我的源代码只是从存储库A移动到存储库B,这项技术也可能让二进制文件有所不同。