2

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

目前一些目标文件是相似的,而另一些则不是。如果我使用 diff 来查看不同之处,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% 证明的情况下,在我看来,每个差异都是在另一个目标文件的转储输出的另一个部分中出现的一行。所以事情似乎有不同的顺序。(但请注意,这只是我目前的假设——我可能错了。)

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

我还看到微软这样写:

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

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

4

1 回答 1

2

因此,即使我无法准确解释为什么二进制文件看起来像这样,但我发现环境中存在一个“意外”差异,这是根本原因。

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

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

于 2015-12-15T14:37:05.357 回答