【发布时间】: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 "$<$<CONFIG:Release>:/LTCG>"). -
@Tsyvarev 你是对的,目标是也设置 LTCG。我相应地更新了我的问题。顺便说一句,它总是在我的测试期间设置。
-
你能尝试为VS2015生成项目并用你的VS2017打开吗?并检查是否在升级后设置。看起来像 cmake 问题 - 在为 VS2015 生成的项目中,它与您的示例位于同一部分。
标签: c++ visual-studio cmake