我试图确保两台不同的机器产生相同的构建。我试图使环境尽可能相似,但我仍然看到生成的 .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)在执行时的行为方式完全相同,所有其他条件都相同。
但我仍然想知道在我的具体情况下发生了什么。在我的情况下,同一台机器上的连续构建提供相同的构建。