Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何查询二进制';s源代码版本_C++_C_Linux_Version Control - Fatal编程技术网

C++ 如何查询二进制';s源代码版本

C++ 如何查询二进制';s源代码版本,c++,c,linux,version-control,C++,C,Linux,Version Control,我的环境是Linux CentOS 6.2。我有一个源代码控制系统,比如svn/hg/git等。我的源代码是C/C++ 我想签入构建二进制文件,以保留向客户发布的二进制文件 我假设当源代码更改时,构建二进制文件的校验和将不同。 所以,我可以反向跟踪哪个二进制文件是从哪个版本生成的 有没有可能,我必须遵循哪些技巧 我看到一些可执行文件在使用-version选项执行时显示修订。 但我想知道如何防止在可执行文件中写入错误版本的字符串 如果我保留一个md5.txt并签入它而不是签入二进制文件。 我如何确

我的环境是Linux CentOS 6.2。我有一个源代码控制系统,比如svn/hg/git等。我的源代码是C/C++

我想签入构建二进制文件,以保留向客户发布的二进制文件

我假设当源代码更改时,构建二进制文件的校验和将不同。 所以,我可以反向跟踪哪个二进制文件是从哪个版本生成的

有没有可能,我必须遵循哪些技巧

我看到一些可执行文件在使用-version选项执行时显示修订。 但我想知道如何防止在可执行文件中写入错误版本的字符串

如果我保留一个md5.txt并签入它而不是签入二进制文件。 我如何确保可以再次构建相同的md5可执行文件

对不起,为了澄清我的问题并防止出现另一个意外的答案,我更喜欢这样的答案:

  • 向用户发布新版本时,在scm中保留md5sum.txt
  • 将二进制文件与SCM分开
  • 要重建相同的md5sum二进制文件,应确保
    • 在make时将符号写入二进制(例如by-DVERSION=“1.x”)
    • 向用户显示版本字符串
    • 删除所有$Id,这会使SCM运行变慢
    • 保持相同的CPU、操作系统、编译器和库环境

  • 这是可执行库还是共享库?如果是后者,则可以导出返回版本(数字、字符串、您的选择)的函数。然后dlopen()、dlsym()并执行该函数

    对于可执行的ELF二进制文件,您可能能够在二进制文件中植入一些数据,这些数据可以使用“nm”实用程序进行查询

  • 在.cpp文件中创建字符串,如下所示:

    static const char version[]=“@(#)$Id$”

    其中$Id$是从SVN获得的

  • 使用what命令(请参阅手册页)。它将从二进制文件中获取这些字符串,以便您进行检查
  • 如果您使用Subversion,将为您完成大部分工作(repo中没有md5,repo保持源代码,具有修订id的二进制资源)


    对于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,这项技术也可能让二进制文件有所不同。