C++ 使用Visual Studio的可复制生成-对象文件差异
我试图确保两台不同的机器产生相同的版本。我已尝试使环境尽可能相似,但在生成的.obj和.exe文件中仍然看到一些差异。我已经能够排除嵌入的路径差异和时间戳。我还确保了最少的代码示例(例如hello world程序实际上生成相同的二进制文件) 当前,某些对象文件类似,而其他对象文件则不同。如果我使用C++ 使用Visual Studio的可复制生成-对象文件差异,c++,visual-studio-2012,object-files,binary-reproducibility,C++,Visual Studio 2012,Object Files,Binary Reproducibility,我试图确保两台不同的机器产生相同的版本。我已尝试使环境尽可能相似,但在生成的.obj和.exe文件中仍然看到一些差异。我已经能够排除嵌入的路径差异和时间戳。我还确保了最少的代码示例(例如hello world程序实际上生成相同的二进制文件) 当前,某些对象文件类似,而其他对象文件则不同。如果我使用dumpbin/all的差异来查看不同的,我会看到如下差异: > COMDAT; sym= "public: static int const std::numeric_limits<lon
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)
>COMDAT;sym=“public:static int const std::numeric_limits::max_exponent”(?max_exponent@?$numeric_limits@O@标准@@2HB)
在许多部分标题中
。在没有100%证明的情况下,在我看来,每个差异都是另一个对象文件转储输出的另一个部分中出现的一行。所以事情的顺序似乎不同。(但请注意,这只是我目前的假设——我可能错了。)
有没有关于如何从这里继续前进以及原因可能是什么的提示?构建/链接订单
我还看到微软写了:
注意:在连续构建时,VisualC++将不会生成相同的二进制文件。但是,可以保证EXE(或DLL)在执行时的行为方式完全相同,所有其他条件都相同
但我仍然想知道在我的具体案例中发生了什么。在我的例子中,同一台机器上的连续构建提供了相同的构建。因此,尽管我无法确切解释为什么二进制文件看起来如此,但我发现环境中存在一个“意外”的差异,这是根本原因 构建日志提到了rc.exe(资源编译器)的不同版本。事实证明,它是VS附带的Windows工具包的一部分。但是,如果安装两个版本的visual studio,它们将共享rc,而编译器和链接器是分开的
在确保安装了我没有编译的另一个VS后,将二进制文件更改为与我期望的匹配。不太可能从不同的机器(甚至从同一台机器)获得相同的二进制文件。除非您明确说明哪些部分应该是相同的(以及您将如何处理这些信息),否则这个问题只能回答为:不可能。@IInspectable-对我来说,它足以证明单个构建对是相同的-我不需要连续的二进制匹配。但总的来说,这是一个在Windows中比Linux更难解决的问题吗?VS的局限性?在Linux上构建可复制性的工作已经取得了一些进展,例如debian软件包。正如您已经引用的,Visual Studio保证了相同的行为,仅此而已。您还没有解释为什么需要知道两个二进制文件是否相同(对于相同的某些定义)。如果不知道您为什么需要这些信息,就很难提供令人满意的答案。@IInspectable-这是一项安全要求(类似于TrueCrypt审计中所做的)。如果存在差异,我至少应该能够找出原因。在我上面展示的案例中,我仍然没有令人满意的答案。对于较小的程序,我已经能够指出差异A是由X造成的,差异B是由Y造成的。您是否尝试了链接到的知识库文章中建议的步骤(特别是使用带有/RAWDATA开关的DUMPBIN),即使它们可能适用于您不使用的编译器?