VS2017设置默认关闭Spectre缓解(以及解决CMake因此找不到编译器的问题)

简介

Spectre缓解按百度的说法就是 一种硬件漏洞的软件规避方法。按微软的说法是默认关闭的(MSVC编译器选项/Qspectre)。简介完。

但是

据说安装了WDK之后会有个bug导致Spectre缓解被默认打开了,如果没有安装带Spectre缓解的库,编译就会失败,如下图:

解决方案一

索性把安装带Spectre缓解的库,反正是缓解漏洞安全隐患的,装上实现Spectre缓解也不是坏事。直接在Visual studio Installer,点【修改】、【单个组件】里面就有带Spectre缓解的库:

要不要安装Arm的版本看自己需要,应该是给安卓、IOS、嵌入式开发开用得上,PC一般不会是ARM的。

解决方案二

艰难找到一个论坛,里面有人说是装了WDK,里面有的prop文件打开了Spectre缓解选项,导致VS默认启用了Spectre缓解。

在F:\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Platforms\{ARM|AM64|Win32|x64}\ImportBefore\Default\Microsoft.Cpp.WDK.props

中间的目录根据不同平台有4个子目录,我只改了Win32和x64的,ARM的就没管他了,各位看着办。Notepad++打开Microsoft.Cpp.WDK.props文件,内容如下:

<!--
***********************************************************************************************
Copyright (C) Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <_NT_TARGET_VERSION_WIN10_RS5>0xA000006</_NT_TARGET_VERSION_WIN10_RS5>
    <_NT_TARGET_VERSION_WIN10_RS4>0xA000005</_NT_TARGET_VERSION_WIN10_RS4>
    <_NT_TARGET_VERSION_WIN10_RS3>0xA000004</_NT_TARGET_VERSION_WIN10_RS3>
    <_NT_TARGET_VERSION_WIN10_RS2>0xA000003</_NT_TARGET_VERSION_WIN10_RS2>
    <_NT_TARGET_VERSION_WIN10_RS1>0xA000002</_NT_TARGET_VERSION_WIN10_RS1>
    <_NT_TARGET_VERSION_WIN10_TH2>0xA000001</_NT_TARGET_VERSION_WIN10_TH2>
    <_NT_TARGET_VERSION_WIN10>0x0A00</_NT_TARGET_VERSION_WIN10>
    <_NT_TARGET_VERSION_WINV63>0x0603</_NT_TARGET_VERSION_WINV63>
    <_NT_TARGET_VERSION_WIN8>0x0602</_NT_TARGET_VERSION_WIN8>
    <_NT_TARGET_VERSION_WIN7>0x0601</_NT_TARGET_VERSION_WIN7>
    <_NT_TARGET_VERSION_VISTA>0x0600</_NT_TARGET_VERSION_VISTA>
    <_NT_TARGET_VERSION_LONGHORN>0x0600</_NT_TARGET_VERSION_LONGHORN>
    <_NT_TARGET_VERSION_NT4>0x0400</_NT_TARGET_VERSION_NT4>
  </PropertyGroup>

  <!-- 下面这段像这里这样注释掉 -->
  <!-- <PropertyGroup>
    <SpectreMitigation Condition="'$(SpectreMitigation)' == ''">Spectre</SpectreMitigation>
  </PropertyGroup> -->

</Project>

从最接近的PropertyGroup开始把SpectreMitigation那一块都注释掉,重启VS,新建的项目就是默认禁用Spectre缓解的了。旧的项目如果属性页面设置了启用会覆盖这里的设置,可能还是要手动改一下。

CMake

The CXX compiler identification is unknown
The C compiler identification is unknown
CMake Error at CMakeLists.txt:6 (project):
  No CMAKE_CXX_COMPILER could be found.



CMake Error at CMakeLists.txt:6 (project):
  No CMAKE_C_COMPILER could be found.



Configuring incomplete, errors occurred!
See also "H:/uchardet-0.0.7/build/CMakeFiles/CMakeOutput.log".
See also "H:/uchardet-0.0.7/build/CMakeFiles/CMakeError.log".

行号不一定是第6行,反正就是识别不了编译器,CMAKE_CXX_COMPILER和CMAKE_C_COMPILER没找到,我还当真的了。直到按提示看了看CMakeError.log看到里面说的已启用 Spectre 缓解才想起来这个启用了会编译不过,明白过来了不是CMake真的没有识别到MSVC,而是CMake用来测试编译器的示例代码编译不过导致CMake不认VS2017的编译器。按上面的方法处理之后就能识别了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章