检测 GYP 中的 MSVC 版本
Detect MSVC version in GYP
我正在尝试在我的binding.gyp文件中node-gyp configure
期间检测msvc版本。基本上,我希望能够链接到基于Visual C++版本的特定第三方库:
['OS=="win"' and 'toolset="vc12"' , {
'libraries': [
"opencv/lib/vc12/opencv_world300.lib"
],
}],
['OS=="win"' and 'toolset="vc11"' , {
'libraries': [
"opencv/lib/vc11/opencv_world300.lib"
],
}],
['OS=="win"' and 'toolset="vc10"' , {
'libraries': [
"opencv/lib/vc10/opencv_world300.lib"
],
}]
不幸的是,GYP中既没有定义toolset
,也没有_toolset
甚至$(TOOLSET)
变量。我无法在 GYP 文档中找到这样的变量。可能吗?
我无法从文档中弄清楚如何检查工具集版本,但只找到了顶级设置:https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#Skeleton-of-a-typical-executable-target-in-a-gyp-file。
然而,GitHub 上的@saper使用 MSVS_VERSION
来解决这个问题:
['OS=="win"' and 'MSVS_VERSION=="2013"' , {
'libraries': [
"opencv/lib/vc12/opencv_world300.lib"
],
}],
['OS=="win"' and 'MSVS_VERSION=="2012"' , {
'libraries': [
"opencv/lib/vc11/opencv_world300.lib"
],
}],
['OS=="win"' and 'MSVS_VERSION=="2010"' , {
'libraries': [
"opencv/lib/vc10/opencv_world300.lib"
],
}]
(nit:在您的示例中,虽然 gyp 没有识别toolset
令牌,但=
应该替换为 ==
(
示例:https://github.com/saper/node-sass/blob/c7e9cf0f0e0098e8316bd41722fc2edf4a835d9f/src/libsass.gyp#L91-L94。
限制 1:
不幸的是,这些条件不会在.targets
或.vcxproj
文件中发出(例如这个(,但它会在对给定版本的 MSVS 单独条件进行后处理后发出.vcxproj
,从而使.vcxproj
文件与较新/旧版本的 VCR 不兼容。
但是,MSVS 版本可以通过多种方式覆盖 gyp,例如,使用环境变量:
在 CMD 中:
SET GYP_MSVS_VERSION=2012
或者在PowerShell中:
$env:GYP_MSVS_VERSION=2015
它也可以作为命令行参数传递:
node_modules/.bin/node-gyp build --msvs_version=2012
如果 env-var 和命令行参数都存在,CLI 参数将优先。
此 CLI 参数可以提供给 npm 任务,例如,强制约束包的所有 Windows 使用者使用特定版本的 MSVCR,否则出错。
从此以后..
限制 2:
从 CLI 参数中,无法指定最低 MSVS 版本,没有这样的标志:--min-msvs-version
.
限制 3:
如果安装了多个版本的MSBUILD,node-gyp的MSBUILD发现(目前(将忽略首选/必需的工具集版本,但会优先考虑PATH中的工具.vcxproj
集。在这种情况下,您可能会遇到错误,例如,如果您使用的是仅由VS2015提供的C99/C++1/4/7]功能。要纠正这种情况,请执行以下操作:
- 将 PATH 重置为所需版本的 MSBuild bin 目录。
- 代替
node-gyp build
或rebuild
,使用node-gyp configure
后跟"%ProgramFiles(x86)%MSBuild14.0BinMSBuild" build/binding.sln /p:Configuration=Release
(或从posh,它将变为:&"${env:ProgramFiles(x86)}MSBuild14.0BinMSBuild" buildbinding.sln /p:Configuration=Release
( - 通过发送 node-gyp 和 pangyp 的拉取请求来修复工具集版本感知的 MSBUILD 发现,如果你的 Windows 注册表技能不像我那么生疏。 :)
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- MSVC多行宏编译器错误
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- MSVC将仅移动结构参数解释为指针
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 为Bazel指定MSVC版本
- MSVC OSVersion 返回不正确的版本
- 在 MSVC 中将某些库的目标平台版本设置为 10.x 是否使程序与在 Windows Vista/7/8 上运行不兼容
- 将早期 MSVC 版本生成的代码重新生成为较新版本时可能遇到的问题
- MSVC 2013正在x64内部版本中加载x86系统库
- visual C++默认特殊成员函数的多个版本——MSVC 2015中的错误
- GLib2+MSVC:分叉 GLib2 以制作"light"版本的库
- 检测 GYP 中的 MSVC 版本
- msvc版本中的链接器不匹配.有什么变通办法吗
- 禁用特定MSVC版本的优化
- MSVC在调试构建中链接到发布库,而不是调试版本