c++ - 在 GYP 中检测 MSVC 版本

标签 c++ node.js opencv node-gyp

我试图在我的 binding.gyp 文件中的 node-gyp configure 期间检测 msvc 版本。 基本上,我希望能够链接到基于 Visual C++ 版本的特定 3rdparty 库:

['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"
    ],
}]

不幸的是,toolset_toolset 甚至 $(TOOLSET) 变量都没有在 GYP 中定义。 我无法在 GYP 文档中找到此类变量。有可能吗?

最佳答案

我无法从文档中找出如何检查工具集版本,但只找到了顶级设置:https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md#Skeleton-of-a-typical-executable-target-in-a-gyp-file .

但是,GitHub 上的@saper figured it out使用 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 token ,但 = 应替换为 == )

示例:https://github.com/saper/node-sass/blob/c7e9cf0f0e0098e8316bd41722fc2edf4a835d9f/src/libsass.gyp#L91-L94 .

局限一:

不幸的是,这些条件不会在 .targets.vcxproj 文件中发出(例如 this ),但它会发出 .vcxproj 在后处理后,条件与给定版本的 MSVS 分开,因此呈现 .vcxproj 文件与新/旧版本的 VCR 不兼容。

但是,可以通过多种方式为 gyp 覆盖 MSVS 版本,例如,使用环境变量:

在命令行中:

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,否则会出错。

从那以后..

限制2:

在 CLI arg 中,无法指定最低 MSVS 版本,没有这样的标志:--min-msvs-version

限制3:

如果安装了多个版本的 MSBUILD,node-gyp 的 MSBUILD 发现 ( at present ) 将忽略.vcxproj 工具集的首选/必需 版本,但是将优先于 PATH 中的那个。在这种情况下,您可能会遇到错误,例如,如果您使用的是仅由 VS2015 提供的 C99/C++1[1/4/7] 功能。要补救这种情况:

  • 将 PATH 重置为所需版本的 MSBuild bin 目录。
  • 而不是 node-gyp buildrebuild,使用 node-gyp configure 后跟 "%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild"build/binding.sln/p:Configuration=Release(或者从 posh 开始,它将变为:&"${env:ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild"build\binding.sln/p:Configuration=Release)
  • 通过发送 node-gyp 和 pangyp 的合并请求来修复工具集版本感知 MSBUILD 发现,如果您的 Windows 注册表技能不像我的那么生疏。 :)

关于c++ - 在 GYP 中检测 MSVC 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311665/

相关文章:

javascript - 如何使用 putItem 替换 Node.js Simpledb 中的属性值

javascript - 在 Express.js 中提交一个变量作为隐藏字段的值

opencv - 如何在opencv中从侧面去除线条?

opencv - 裁剪关键点与裁剪图像和寻找关键点

c++ - 在 C++ 中使用具有继承性的指针

c++ - 将 VAO+IBO 与 GLSL 着色器结合使用

javascript - DocumentDB : Access document by database name, Node.js 中的集合 ID 和文档 ID

c++ - 链接 C++ 项目时出现多重定义错误

c++ - 全局变量与类变量有何不同,它们是否相同?

opencv - 在 OpenCV 中使用 SVD 的 PCA