CMake中的WholeProgramOptimization

Arn*_*aud 6 c++ cmake visual-studio

我该怎么做才能WholeProgramOptimization从CMake 启用?

这是我尝试过的:

  • 我安装了CMake 3.10.2
  • 我安装了Visual Studio 2017 15.5.4
  • 我创建了一个目录C:\ Wpo
  • 我创建了一个空目录C:\ Wpo\Build
  • 我创建了一个包含C:\ Wpo\Wpo.cpp的文件 int main(){return 0;}
  • 我创建了一个包含以下内容的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")
    
    Run Code Online (Sandbox Code Playgroud)
  • 我打开了一个命令行并创建了我的Visual Studio解决方案:

    cd C:\Wpo\Build
    cmake ..
    
    Run Code Online (Sandbox Code Playgroud)

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

      <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>
Run Code Online (Sandbox Code Playgroud)

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

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

        <WholeProgramOptimization>true</WholeProgramOptimization>

      </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
  • 这是CMake的错误吗?看起来它正在将此WholeProgramOptimization部分添加到错误的位置.
  • 它是Visual Studio中的错误吗?它也可能是一种回归.
  • 我是否采用了弃用的方法?CMake发生了很多事情;-)

任何帮助将不胜感激.

rus*_*tyx 5

Visual Studio 项目中有3 个地方可以使用整个程序优化设置 -

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

全程序优化

这是启用整个程序优化的便利元设置。

在项目 XML 中,它位于<PropertyGroup>/<WholeProgramOptimization>

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

全程序优化/GL

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

在项目XML它位于<ItemDefinitionGroup>/ <ClCompile>/<WholeProgramOptimization>

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

链接时代码生成/LTGC

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

在项目XML它位于<ItemDefinitionGroup>/ <Link>/<LinkTimeCodeGeneration>

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

set_target_properties(Wpo PROPERTIES COMPILE_FLAGS "$<$<CONFIG:Release>:/GL>")
set_target_properties(Wpo PROPERTIES LINK_FLAGS "$<$<CONFIG:Release>:/LTCG>")
Run Code Online (Sandbox Code Playgroud)