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

时间:2009-11-02 04:04:36

标签: c visual-c++ compilation

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

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

我的问题,

VC ++生成的可执行文件是否随重新编译而变化? 或者我错过了什么?

1 个答案:

答案 0 :(得分:7)

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

其中一个答案也与this MSDN blog post有关,其中指出:

  

...编译器编写者更有兴趣生成正确运行的代码并快速生成代码,而不是确保生成的内容在硬盘上的布局相同。由于优化代码的方法和实现众多且多样化,因此总有可能一个构建最终会花费更多时间来执行额外或不同于另一个构建的操作。因此,最终结果可能是相同功能的不同位组。

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