gpt4 book ai didi

c++ - 使用 Visual Studio 的可重现构建 - 目标文件差异

转载 作者:行者123 更新时间:2023-11-30 05:34:19 24 4
gpt4 key购买 nike

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

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

我也看到微软写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.

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

最佳答案

因此,尽管我无法准确解释为什么二进制文件看起来像它,但我确实在环境中发现了一个“意想不到的”差异,这是根本原因。

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

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

关于c++ - 使用 Visual Studio 的可重现构建 - 目标文件差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34287720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com