当我使用 c++ 编译器构建项目时,如果源代码没有更改,我能否确保生成的二进制文件不受影响?看起来每次我重新编译我的源代码时,二进制文件的 md5 校验和都会受到影响。编译时间是否会以某种方式影响生成的二进制文件?如何生成可重复的编译结果?
4 回答
可以反汇编二进制文件并在输出上运行 md5
MacOSX 上的示例
otool -tV a.out | md5
ee2e724434a89fce96aa6b48621f7220
但是,一个人错过了全局数据......(也可能是一个要包含的参数)
我正在回答 md5 检查二进制文件的问题......您如何管理您的源代码和构建系统,正如其他人所写的那样也是值得关注的
我怀疑它在很大程度上取决于您的工具链和操作系统。例如,如果其中一个可执行标头包含时间戳,那么您总是会发现生成的 MD5 是不同的。
您要达到的最终结果是什么(即为什么它们相同如此重要)..?
您不能对 Visual Studio 进行 md5 校验和比较。对于来自 Visual Studio 的普通发行版 .exe 文件,每次重新编译都会有 3 个位置发生变化。其中两个是时间戳,第三个是唯一的 GUID,Visual Studio 使用它来匹配 .exe 的版本与帮助文件以确保它们同步。
可能可以编写一个工具将 3 个更改字段归零,但我不确定解析文件有多容易。
此外,如果您调用任何 .dll,如果我没记错的话,您将在生成的文件中获得更多唯一标识符。
调试版本是另一回事。我认为还有很多很多不同之处。
使用增量构建系统 - 例如make
确保在源不更改时不会重新编译代码。
有可能让您的编译器从相同的源生成相同的二进制文件 - 或者它可能不会 - 这取决于编译器。大多数会将当前时间嵌入到生成的二进制文件中。