【发布时间】:2018-12-06 19:23:53
【问题描述】:
我注意到 Visual Studio 为调试版本生成 *.ilk 文件,为发布版本生成 *.iobj 文件。据我了解,这两种文件类型都用作增量链接器的输入。它们之间有什么区别?它们可以一起使用吗?如何在项目设置中禁用这些文件?
【问题讨论】:
标签: visual-studio visual-c++ linker pdb
我注意到 Visual Studio 为调试版本生成 *.ilk 文件,为发布版本生成 *.iobj 文件。据我了解,这两种文件类型都用作增量链接器的输入。它们之间有什么区别?它们可以一起使用吗?如何在项目设置中禁用这些文件?
【问题讨论】:
标签: visual-studio visual-c++ linker pdb
根据this answer,生成 .iobj 文件以支持增量链接时间代码生成(又名 LTCG,我相信过去被称为“整个程序优化”)和LTCG 通常仅对发布版本启用。
LTCG 可以执行的一项优化是内联来自另一个编译单元(即源文件)的函数。编译器(当然)不能这样做。毫无疑问还有其他人。
另一方面,.ilk 文件支持用于调试构建的增量链接,以获得更快的链接时间。这与增量 LTCG 不同,在增量 LTCG 中,链接器尝试利用它以前做过的交叉编译单元优化,再次加快速度,但方式不同。
因此,要禁止生成 .iobj 文件,请为您的项目关闭“增量链接时间代码生成”,要禁止生成 .ilk 文件,请关闭“增量链接”。我相信这两个都是链接器选项。但是为什么要打扰呢? - 他们加快了发展。相反,我会在归档项目的 [一个版本] 时删除这些文件。
对于发布版本,增量链接通常是关闭的,尽管我不知道为什么。也许这两个选项相互不兼容,我从未尝试过同时启用它们。或者也许 MS 认为我们已经厌倦了他们用构建产品把我们的硬盘弄得乱七八糟,谁知道呢?
【讨论】: