使用Visual Studio重现构建 - 目标文件的差异

时间:2015-12-15 11:12:14

标签: c++ visual-studio-2012 object-files binary-reproducibility

我正在努力确保两台不同的机器生成相同的版本。我试图使环境尽可能相似,但我仍然看到生成的.obj和.exe文件存在一些差异。我已经能够排除嵌入式路径差异和时间戳。我还确保了最小的代码示例(比如hello world程序实际上产生了相同的二进制文件)。

目前一些目标文件类似,而其他目标文件则不相似。如果我使用dumpbin /all的差异查看不同的那些,我会看到这样的差异:

> COMDAT; sym= "public: static int const std::numeric_limits<long double>::max_exponent" (?max_exponent@?$numeric_limits@O@std@@2HB)

< COMDAT; sym= "public: static int const std::_Locbase<int>::collate" (?collate@?$_Locbase@H@std@@2HB)
许多SECTION HEADER中的

。在没有100%证明它的情况下,在我看来,每个差异都是在另一个目标文件的转储输出中的另一个部分中出现的行。所以事情似乎是以不同的顺序。 (但请注意,这只是我目前的假设 - 我可能错了。)

有关如何从这里继续前进以及原因可能是什么的任何提示?建立/链接订单?

我也看到微软写了this

  

注意:在连续构建中构建相同的源文件时,无法保证Visual C ++将生成相同的二进制映像。但是,保证EXE(或DLL)在执行时的行为方式完全相同,所有其他条件相同。

但我仍然想知道在我的具体案例中发生了什么。在我的情况下,在同一台机器上的连续构建提供相同的构建。

1 个答案:

答案 0 :(得分:1)

所以,即使我无法解释为什么二进制文件看起来像是这样,我发现了一个&#34;意外的&#34;作为根本原因的环境差异。

构建日志提到了rc.exe(资源编译器)的不同版本。事实证明,它是VS附带的Windows套件的一部分。但是,如果安装两个版本的visual studio,它们将共享rc,而编译器和链接器是分开的。

确保安装其他VS后,我没有编译二进制文件改为符合我的预期。