在 ubuntu 上安装 npm 期间,使用 c++ 17 编译本机节点插件失败
Posted
技术标签:
【中文标题】在 ubuntu 上安装 npm 期间,使用 c++ 17 编译本机节点插件失败【英文标题】:Compiling native node addon with c++ 17 inside fails during npm install on ubuntu 【发布时间】:2017-08-15 05:42:16 【问题描述】:我有使用 c++17 功能的 nodejs 的本机插件,特别是“shared_mutex”。 当我调用下载和编译插件的 npm install 时,我收到一个错误:
linux机器安装了GCC 6.0。
我的 Binding.gyp 使用以下配置来捕获操作系统类型并相应地添加标志:
'conditions': [
['OS=="linux"',
'CXXFLAGS': [
'-std=c++1z'
]],
** 我也尝试过使用 '-std=c++17'、'-std=c++1z'。
我错过了什么?
更新: 1. 将 ubuntu 16.04 更新为 GCC 16.04 并设为默认。 2.似乎当我尝试使用 node-gyp rebuild "CXXFLAGS='-std=c++17'" 手动编译它时,它可以工作并且只带来一个错误: “命名空间std中的shared_,utex没有命名一个类型std::shared_mutex文件mutex”(最后一个错误)
【问题讨论】:
首先,c++1y 是 14 而不是 17,17 是 1z。其次,尝试使用 cxxflags 而不是 cflags。 你看到-std=c++1y
在编译时传递给gcc
。 gcc 命令将在错误消息上方
shared_mutex
在 6.1 中添加。 (请注意,C++17 标准尚未完成。编译器支持是不可预测的。)
更新到 CXXFLAGS="-std=c++1z" - 仍然没有通过标志。
我已将 GCC 更新到 6.3,但仍然无法使用相同的错误。但是当我手动“node-gyp rebuild CXXFLAGS=-std=c++17”时,它似乎部分起作用了
【参考方案1】:
问题解决了。对于遇到相同问题的任何人,bind.gyp 应该使用 cflags_cc 而不是 cxxflags。
【讨论】:
以上是关于在 ubuntu 上安装 npm 期间,使用 c++ 17 编译本机节点插件失败的主要内容,如果未能解决你的问题,请参考以下文章
在 elasticbeanstalk 上安装 npm canvas - npm 安装错误
在 Ubuntu 14.04 上通过 npm 安装 jsdom 的问题
使用节点 9.11.1 和 npm 5.6.0(用于 Solidity 开发)在 ubuntu 16.04 上安装 web3 时遇到困难