【问题标题】:WholeProgramOptimization in CMakeCMake 中的全程序优化
【发布时间】:2018-07-04 01:19:50
【问题描述】:

如何从 CMake 启用 WholeProgramOptimization

这是我尝试过的:

  • 我已安装 CMake 3.10.2
  • 我已安装 Visual Studio 2017 15.5.4
  • 我创建了一个目录 C:\Wpo
  • 我创建了一个空目录 C:\Wpo\Build
  • 我创建了一个包含int main(){return 0;} 的 C:\Wpo\Wpo.cpp 文件
  • 我创建了一个 C:\Wpo\CMakeLists.txt 文件,其中包含以下内容:

    CMAKE_MINIMUM_REQUIRED (VERSION 3.10)
    PROJECT(Wpo)
    ADD_EXECUTABLE(Wpo "../Wpo.cpp")
    TARGET_COMPILE_OPTIONS(Wpo PRIVATE "$<$<CONFIG:Release>:/GL>")
    SET_TARGET_PROPERTIES(Wpo PROPERTIES LINK_FLAGS_RELEASE "/LTCG")
    
  • 我打开了一个命令行并创建了我的 Visual Studio 解决方案:

    cd C:\Wpo\Build
    cmake ..
    

但是当我在 Visual Studio 中打开我的解决方案时,没有设置整个程序优化。有趣的是,vcxproj 文件中有一个WholeProgramOptimization

      <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
        <ClCompile>
          <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
          <AssemblerListingLocation>Release/</AssemblerListingLocation>
          <CompileAs>CompileAsCpp</CompileAs>
          <ExceptionHandling>Sync</ExceptionHandling>
          <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
          <Optimization>MaxSpeed</Optimization>
          <PrecompiledHeader>NotUsing</PrecompiledHeader>
          <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
          <RuntimeTypeInfo>true</RuntimeTypeInfo>
          <WarningLevel>Level3</WarningLevel>

          <WholeProgramOptimization>true</WholeProgramOptimization>

          <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR="Release";%(PreprocessorDefinitions)</PreprocessorDefinitions>
          <ObjectFileName>$(IntDir)</ObjectFileName>
          <DebugInformationFormat></DebugInformationFormat>
        </ClCompile>
      </ItemDefinitionGroup>

如果我从项目的属性中手动选择整个程序优化,则会在 vcxproj 文件的另一部分添加一个条目:

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
        <ConfigurationType>Application</ConfigurationType>
        <CharacterSet>MultiByte</CharacterSet>
        <PlatformToolset>v141</PlatformToolset>

        <WholeProgramOptimization>true</WholeProgramOptimization>

      </PropertyGroup>
  • 这是来自 CMake 的错误吗? 看起来它在错误的位置添加了这个 WholeProgramOptimization 部分。
  • 这是 Visual Studio 的错误吗?也可能是回归。
  • 我是否采用过时的方式来执行此操作?这在 CMake 中经常发生;-)

任何帮助将不胜感激。

【问题讨论】:

  • 根据msdn编译器标志 /GL应该伴随着链接器标志 /LTCG。您是否也尝试设置链接器标志? set_target_properties(Wpo PROPERTIES LINK_FLAGS "$&lt;$&lt;CONFIG:Release&gt;:/LTCG&gt;").
  • @Tsyvarev 你是对的,目标是也设置 LTCG。我相应地更新了我的问题。顺便说一句,它总是在我的测试期间设置。
  • 你能尝试为VS2015生成项目并用你的VS2017打开吗?并检查是否在升级后设置。看起来像 cmake 问题 - 在为 VS2015 生成的项目中,它与您的示例位于同一部分。

标签: c++ visual-studio cmake


【解决方案1】:

要使用此功能,您需要添加编译器选项 /GL(整个程序优化)和链接器选项 /LTCG(链接时代码生成)。

SET_TARGET_PROPERTIES(Wpo PROPERTIES COMPILE_FLAGS "/GL")
SET_TARGET_PROPERTIES(Wpo PROPERTIES LINK_FLAGS "/LTCG")

【讨论】:

  • 不幸的是,它不适用于我的配置。你有哪些 Visual Studio 版本和 CMake 版本?
  • cmake 3.4 + VS 2015
  • 哪个标志没有设置?
  • /GL 未设置。
  • 如果你编辑 vcxproj,是 WholeProgramOptimization 行吗?
【解决方案2】:

在 Visual Studio 项目中有 3 个地方可以显示整体程序优化设置 -

1) 在项目级别(项目 → 常规选项卡)

这是一个方便的元设置,用于启用整个程序优化。

在项目 XML 中,它位于&lt;PropertyGroup&gt;/&lt;WholeProgramOptimization&gt;

2) 在编译器级别(C/C++ → 优化选项卡)

这是实际的/GL 设置,默认为项目级设置。

在项目 XML 中,它位于&lt;ItemDefinitionGroup&gt;/&lt;ClCompile&gt;/&lt;WholeProgramOptimization&gt;

3) 在链接器级别(链接器 → 优化选项卡)

这是实际的/LTCG 设置,默认为项目级设置。

在项目 XML 中,它位于 &lt;ItemDefinitionGroup&gt;/&lt;Link&gt;/&lt;LinkTimeCodeGeneration&gt;

以下 CMake 命令不会在项目级别设置 WholeProgramOptimization,而是在编译器和链接器级别设置。这就是“常规”选项卡中的“便利”设置为空白的原因。然而,净效果是一样的。 WholeProgramOptimization 已开启。

set_target_properties(Wpo PROPERTIES COMPILE_FLAGS "$<$<CONFIG:Release>:/GL>")
set_target_properties(Wpo PROPERTIES LINK_FLAGS "$<$<CONFIG:Release>:/LTCG>")

【讨论】:

  • 链接器选项应该是 /LTCG 而不是 /LTGC。
  • 这是否意味着通过 2) 和 3) 设置的值会覆盖通过 1) 设置的任何值?那么,即使提供选项 1)又有什么意义呢?
  • 选项 1 是方便的元选项,在未设置时驱动 both 2) 和 3) together,通常是这种情况.所以通常 WholeProgramOptimization 是在一个地方启用的,这很方便。
猜你喜欢
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多