简介
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的编译器。按上面的方法处理之后就能识别了。