在 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 的问题

Ubuntu上使用npm命令全局安装的包所在的路径

在ubuntu上安装最新稳定版本的node及npm

在ubuntu上安装最新稳定版本的node及npm

使用节点 9.11.1 和 npm 5.6.0(用于 Solidity 开发)在 ubuntu 16.04 上安装 web3 时遇到困难