重新编译相同的代码会在 VC++ 中产生不同的可执行文件

Posted

技术标签:

【中文标题】重新编译相同的代码会在 VC++ 中产生不同的可执行文件【英文标题】:Recompiling same code produces different executable in VC++ 【发布时间】:2009-11-02 04:04:35 【问题描述】:

我使用 C 开发了一个 Windows 命令行工具,并在 VC++ 中对其进行了编译,有时会返回并签入源代码。我在签入之前清理了项目,除了其他文件之外,它还删除了 .exe 、 .obj 文件。不过我还是继续使用命令行工具。

几个月后,我检查了源代码,再次编译,但生成的EXE与之前编译的版本不匹配。

我的问题,

VC++ 生成的可执行文件是否会随着重新编译而改变? 还是我错过了什么?

【问题讨论】:

正如 Mark Rushakoff 在下面指出的,这是完全相同的副本:***.com/questions/1363217/… 也相关:***.com/questions/1426333/… 【参考方案1】:

查看this question 中的答案,没有办法强制 VS 每次都输出相同的二进制文件。编译器会在可执行文件中嵌入一些元数据,例如时间戳,这就是为什么编译之间的二进制文件不相同的原因。

其中一个答案也链接到this MSDN blog post,其中指出:

...编译器编写者更感兴趣的是生成正确运行的代码并快速生成它,而不是确保生成的任何内容都以相同的方式布局在您的硬盘上。由于用于优化代码的方法和实现多种多样,因此一个构建最终可能会比另一个构建有更多的时间来做一些额外或不同的事情。因此,对于相同的功能,最终结果可能是一组不同的位。

所以,你的答案是肯定的,二进制文件并不是一点一滴都相同,但它们应该在功能上是相同的。

【讨论】:

以上是关于重新编译相同的代码会在 VC++ 中产生不同的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

不同 C 编译器生成的可执行文件的差异

使用相同的命令在不同的文件夹中产生不同的结果

更改 segue 的位置会在 ios 模拟器中产生黑屏

在 R 中转换 POSIXct 会在 3.5.0 版中产生 NA [重复]

日期数学不会在 R 与 Redshift 中产生相同的结果

为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?