Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Visual Studio的可复制生成-对象文件差异_C++_Visual Studio 2012_Object Files_Binary Reproducibility - Fatal编程技术网

C++ 使用Visual Studio的可复制生成-对象文件差异

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

我试图确保两台不同的机器产生相同的版本。我已尝试使环境尽可能相似,但在生成的.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)
>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),即使它们可能适用于您不使用的编译器?