具有 Visual Studio 的可重现构建 - 目标文件差异

Reproducible builds with Visual Studio - object file difference

我试图确保两台不同的机器生成相同的版本。我已尝试使环境尽可能相似,但我仍然看到生成的 .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% 证明它的情况下,在我看来,每个差异都是在另一个目标文件的转储输出的另一部分中出现的一行。所以事情似乎有不同的顺序。 (但请注意,这只是我目前的假设 - 我可能是错的。)

关于如何从这里继续前进以及原因可能是什么的任何提示?构建 / link 命令 ?

我也看到微软写的this:

NOTE: There is no guarantee that Visual C++ will generate the same binary image when building the same source files on successive builds. However, you are guaranteed that the EXE (or DLL) will behave in precisely the same manner under execution, all other things being equal.

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

因此,尽管我无法准确解释为什么二进制文件看起来像它,但我发现环境中有一个 "unexpected" 差异,这是根本原因。

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

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