我试图在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文档中找到这样的变量。它有可能吗?
答案 0 :(得分:5)
我无法从文档中了解如何检查工具集版本,但只找到了顶级设置:https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#Skeleton-of-a-typical-executable-target-in-a-gyp-file。
然而,使用MSVS_VERSION
代替GitHub figured it out上的@saper:
['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"
],
}]
(在您的示例中,虽然gyp未识别toolset
令牌,但=
应替换为==
)
很遗憾,这些条件不会在.targets
或.vcxproj
文件中发出(例如this),但在对条件进行后处理后会发出.vcxproj
对于给定版本的MSVS是分开的,因此使.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 arg将优先使用。
此CLI参数可以提供给npm任务,例如,为您的程序包的所有Windows使用者强制使用特定版本的MSVCR,否则会出错。
从那以后......
从CLI arg,无法指定最小MSVS版本,没有这样的标记:--min-msvs-version
。
如果安装了多个版本的MSBUILD,则node-gyp的MSBUILD发现(at present)将忽略.vcxproj
的首选/必需版本的工具集,但优先于PATH中的那个。在这种情况下,您可能会收到错误,例如,如果您使用的是仅由VS2015提供的C99 / C ++ 1 [1/4/7]功能。为了解决这种情况:
node-gyp build
或rebuild
,请使用node-gyp configure
,然后使用"%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild" build/binding.sln /p:Configuration=Release
(或者从豪华,它将成为:&"${env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild" build\binding.sln /p:Configuration=Release
)