【问题标题】:What causes linker warning "MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG"?是什么导致链接器警告“找到 MSIL .netmodule 或使用 /GL 编译的模块;使用 /LTCG 重新启动链接”?
【发布时间】:2014-12-04 10:26:32
【问题描述】:

我的解决方案中的某些项目会产生此链接器警告:

MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance

我正在使用 Visual Studio 2013 Update 3。我还无法确定可能导致此问题的项目的任何特定内容。

那些产生这个的项目是什么?


我看过这个:http://msdn.microsoft.com/en-us/library/k669k83h.aspx 但我不知道我们正在使用任何 CLR、托管代码、/LN 或 /NOASSEMBLY。

【问题讨论】:

  • 我的水晶球说您在项目的调试版本中通过链接使用发布配置设置构建的静态 .lib 收到此警告。默认情况下已打开 /GL。除了这个警告之外,这通常是一个非常糟糕的消息,YMMV。

标签: visual-studio visual-studio-2013 linker


【解决方案1】:

我遇到了同样的问题,所以我做了一些研究。

根据https://msdn.microsoft.com/en-us/library/0zza0de8.aspx

如果你用 /GL 和 /c 编译你的程序,你应该使用 /LTCG 用于创建输出文件的链接器选项。

所以消息可能有点误导 - 问题不在于 MSIL .netmodule,而是使用 /GL 编译的模块

当使用/GL 时,您告诉编译器延迟一些代码的生成,即围绕函数边界,以优化它们。 LTCG 指示链接器生成(和优化)丢失的代码。否则,程序将无法按预期运行。

基本上,两个开关应该一起使用(使用时)。它们适用于构建的不同部分:一个用于编译,另一个用于链接。

为了完整性:

  • /GL 由配置属性 > C/C++ > 优化 > 整个程序优化控制

  • /LTCG 由配置属性 > 链接器 > 优化 > 整个程序优化控制

在以后的版本中,

  • /LTCG 由 Configuration Properties > Linker > Optimization > Link Time Code Generation / Use Link Time Code Generation (/LTCG) 控制

【讨论】:

  • 设置不是“全程序优化”。它被命名为“使用链接时间代码生成”。
【解决方案2】:

我遇到了同样的错误并花了很多时间试图修复它。最后,我发现它出现是由于在我的一个依赖库中使用了“整个程序优化”选项。

默认情况下,此选项在新创建的项目中设置为“是”。当我将其更改为“否”并重新编译所有依赖项时,警告消失了。我有纯原生 C++ 解决方案,没有任何托管代码。

要修复,打开所有依赖项目的项目设置并检查设置:

配置属性 > C/C++ > 优化 > 整个程序优化

确保在任何地方都将其设置为“否”。

【讨论】:

  • 不完全。虽然这会使警告消失,但它也会禁用一些优化。最好启用“链接时间代码生成”设置。
  • “链接时间码生成”设置是更好的选择。但是,它并不总是很方便,因为它不是默认设置。想象一下,您为广大受众提供了一个库。然后,您必须在使用该库的每个最终项目中编写有关调整设置的说明。该库的潜在用户可能会产生怀疑,并选择在他们的项目中不使用它。更改 C++ 选项中的设置会损害效率,但可以实现与默认值的兼容性。选择哪种场景大家要根据具体情况单独决定。
  • Erm,“链接时间代码生成”是发布版本中的默认设置——否则将“整个程序优化”作为默认设置是没有意义的。
  • 只是为了实验,我在 VS 2013 中创建了一个新的示例 C++ 控制台应用程序。它在链接器选项中不包含 /LTCG。
  • 附加输入:根据Visual C++ Team Blog,您应该“永远不要将 /GL 用于您打算放入库中并发送给客户的代码”
【解决方案3】:

通过告诉链接器您使用的 /GL 设置,我发现同样的错误消失了:

设置... 配置属性/链接器/优化/链接时间码生成 到 ... 非默认设置之一

也许https://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx 有用吗?

尼尔

【讨论】:

    【解决方案4】:

    这条消息显示了很多,这确实引起了怀疑。我使用一个属性表来告诉 /GL 和 /LTCG。该项目没有使用任何外部库。我收到了这条消息,这没有任何意义。如果我转到项目属性并从那里再次指定“使用链接时间代码生成”,它就会消失。它不会改变命令行或任何东西,只会让 VC 开心...

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 2015-05-23
      • 2021-06-09
      • 2020-02-23
      • 2018-05-18
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多