cmake调用VS2019的v140(VS2015)的工具链编译通过

最近的工作基本上在Linux上做。

但是,也有一个小工具需要同时支持Windows/Linux,工具依赖于Qt,从官方下载的版本上有qt5.6.3/5.12.12,这两个版本都有MSVC2015。

因此搞了一个Win7的虚拟机,VS2015实在太大了,从VS2019的社区版看到可以定制仅安装C++工具链即可。

VS2019裁剪最小项
C++核心桌面功能
实时调试器
Windows 10 SDK(10.0.16299.0)
MSVC v140 - VS 2015 C++ 生成工具(v14.00)

安装完后,使用VS 2019的IDE是可以编译一个样例工程,但通过cmake来调用,就会发现各种问题。

最头痛的一个问题是:

Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified

对应的中文提示往往是:

    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140\Microsoft.Cpp.Current.targets(64,5): error MSB4062: 未能从程序集 C:\Program Files (x86)\MSBuild\Micro
soft.Cpp\v4.0\v140\Microsoft.Build.CppTasks.Common.dll 加载任务“SetEnv”。未能加载文件或程序集“Microsoft.Build.Utilities.Core, Version=14.0.0.0, Culture=neutr
al, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。系统找不到指定的文件。 请确认 <UsingTask> 声明正确,该程序集及其所有依赖项都可用,并且该任务包含实现 Mi
crosoft.Build.Framework.ITask 的公共类。 [D:\01.SrcCode\XXX\build\CMakeFiles\3.25.1\VCTargetsPath.vcxproj]

反复研究、搜索引擎,最终在github一个issue中找到原因,链接:https://github.com/deadlydog/New-NuGetPackage/issues/1

相应关键提示点:需要安装Microsoft Build Tools 2015!!!

> If you install the Microsoft Build Tools 2015 [https://www.microsoft.com/en-us/download/details.aspx?id=48159] it resolved the issue for me.
> 
> I had a number of VS2015 projects with this great package, and after a rebuild of my machine and clean VS2017 Pro installed I had the issue described:
> 
> Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0
> 
> Installing the VS2015 build tools fixed it for me

CMake编译生成VS工程时,还有一些其他注意事项:

1、报MSBUILD找不到VCTargetsPath,

D:\01.SrcCode\xxxx\build\CMakeFiles\3.25.1\VCTargetsPath.vcxproj(14,2): error MSB4019: 未找到导入的项目“D:\Microsoft.Cpp.Default.props”。请确认 <Import> 声明中的路径正确,且磁盘上存在该文件。

 实际上是MSBUILD找不到VS2015工具集的一些配置信息,通常安装在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140路径下

通过环境变量设置即可解决,如下:

set VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140

2、VS2015与Windows SDK的配套问题,VS2015默认支持Windows 8.1 SDK,而现在通常是Windows 10 SDK,而且版本越来越新。

实际上Windows 10 SDK的新版本也是不再默认支持VS2015,最后支持VS2015的SDK版本为10.0.14393.0

链接:https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2014%202015.html

通常的解决办法是定义环境变量:CMAKE_SYSTEM_VERSIONCMAKE_WINDOWS_KITS_10_DIR,从文档https://cmake.org/cmake/help/v3.13/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.html

来看CMAKE_WINDOWS_KITS_10_DIR应该定义成这样:

set CMAKE_WINDOWS_KITS_10_DIR=C:\Program Files (x86)\Windows Kits\10

不带Include/10.0.xxxx字样。

CMAKE_SYSTEM_VERSION在环境变量中设置不起作用,必须在执行的命令中添加,类似如下:

c:\cmake\bin\cmake.exe -DCMAKE_SYSTEM_VERSION=10.0.14393.0 XXX

3、当然,如果提示msbuild.exe都找不到,则应该在VS 2015 X86/X64本机工具命令提示符下的环境运行,或者执行脚本设置好环境变量c:\xxxx\vsvarsall.bat amd64

 

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