.ilk 和 .iobj 文件有什么区别?

What is the difference between .ilk and .iobj files?

我注意到 Visual Studio 为调试版本生成 *.ilk 文件,为发布版本生成 *.iobj 文件。据我了解,这两种文件类型都用作增量链接器的输入。它们之间有什么区别?它们可以一起使用吗?如何在项目设置中禁用这些文件?

根据 ,.iobj 文件被生成以支持增量 link-time 代码生成(又名 LTCG,过去称为,我相信,'whole program optimization') 和 LTCG 通常只对发布版本启用。

LTCG 可以执行的一个优化是从另一个编译单元(即源文件)内联一个函数。编译器(当然)不能这样做。其他人毫无疑问。

另一方面,

.ilk 文件支持增量 linking 用于调试构建,以获得快速 link 次。这与增量 LTCG 不同,后者 linker 尝试利用它之前做过的交叉编译单元优化,再次加快速度,但方式不同。

因此,要禁止生成 .iobj 文件,请为您的项目关闭 'incremental link time code generation',要禁止生成 .ilk 文件,请关闭 'incremental linking'。我相信这两个都是 linker 选项。但是为什么要打扰呢? - 他们加快发展。相反,我在存档我的项目的 [一个版本] 时删除了这些文件。

增量 linking 对于发布版本通常是关闭的,虽然我不确定为什么。也许这两个选项互不兼容,我从未尝试过同时启用它们。或者也许 MS 认为我们受够了他们用构建产品弄乱我们的硬盘,谁知道呢?