使用 node-addon-api 的 node-gyp Node.js 插件不会覆盖 linux 上的 c++ 版本
node-gyp Node.js addon using node-addon-api is not overriding c++ version on linux
我已经在 Mac OS 上成功地为 node.js 构建了一个 c++ 插件。尝试移植到 Linux (Centos7)。
我正在使用 node.js 12.10 版,node-gyp 5.0.3 版,node-addon-api 1.7.1 版。
Centos 版本 7.6.1810, gcc 版本 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
我的binding.gyp:
{
"targets": [
{
"target_name": "hsm",
### The sources list must be relative to the current directory.
"sources": [ "../../../my_project/src/mypackage/binding-napi.cpp" ],
"include_dirs": [
# this is for using n-api vs nan
"<!@(node -p \"require('node-addon-api').include\")"
],
'dependencies': ["<!(node -p \"require('node-addon-api').gyp\")"],
"cflags_cc": [
"-fexceptions",
],
"conditions": [
['OS=="linux"', {
"cflags_cc": [
"-std=c++17"
]
}],
],
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET':
'10.14',
'CLANG_CXX_LANGUAGE_STANDARD':
'c++17',
'GCC_ENABLE_CPP_EXCEPTIONS':
'YES',
# 'gnu++1z'
'OTHER_CFLAGS': [
"-fcxx-exceptions",
'-Wno-unused-result'
]
}
}
]
}
我尝试在全局 space 和条件下添加到 cflags_cc。如果我都这样做,它会将它添加到 g++ 命令行两次。
这是 g++
上的结果标志
... fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3
-fno-omit-frame-pointer
-fno-rtti
-fno-exceptions
-std=gnu++1y
-fexceptions
-std=c++17 ...
-std=c++17
和-std=c++1z
我都试过了。
common.gypi
文件具有以下相关值:
...
[ 'OS in "linux freebsd openbsd solaris android aix cloudabi"', {
'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++1y' ],
...
我看到很多帖子说要使用 cflags_cc
,我也是,但它只是添加它,而不是替换它,因此我依赖的 c++17 功能没有编译。
你知道我做错了什么吗?
已解决。在 gcc 命令行上附加 c++ 标准确实有效——它遵循最后一个标准。我遇到的问题是被拉入的自定义 c++ 库 - 不知何故 <iomanip>
header 未包含在内,所以一旦我包含在我的 binding.cpp 文件中,编译工作。
我已经在 Mac OS 上成功地为 node.js 构建了一个 c++ 插件。尝试移植到 Linux (Centos7)。
我正在使用 node.js 12.10 版,node-gyp 5.0.3 版,node-addon-api 1.7.1 版。 Centos 版本 7.6.1810, gcc 版本 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)
我的binding.gyp:
{
"targets": [
{
"target_name": "hsm",
### The sources list must be relative to the current directory.
"sources": [ "../../../my_project/src/mypackage/binding-napi.cpp" ],
"include_dirs": [
# this is for using n-api vs nan
"<!@(node -p \"require('node-addon-api').include\")"
],
'dependencies': ["<!(node -p \"require('node-addon-api').gyp\")"],
"cflags_cc": [
"-fexceptions",
],
"conditions": [
['OS=="linux"', {
"cflags_cc": [
"-std=c++17"
]
}],
],
'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET':
'10.14',
'CLANG_CXX_LANGUAGE_STANDARD':
'c++17',
'GCC_ENABLE_CPP_EXCEPTIONS':
'YES',
# 'gnu++1z'
'OTHER_CFLAGS': [
"-fcxx-exceptions",
'-Wno-unused-result'
]
}
}
]
}
我尝试在全局 space 和条件下添加到 cflags_cc。如果我都这样做,它会将它添加到 g++ 命令行两次。
这是 g++
上的结果标志... fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3
-fno-omit-frame-pointer
-fno-rtti
-fno-exceptions
-std=gnu++1y
-fexceptions
-std=c++17 ...
-std=c++17
和-std=c++1z
我都试过了。
common.gypi
文件具有以下相关值:
...
[ 'OS in "linux freebsd openbsd solaris android aix cloudabi"', {
'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++1y' ],
...
我看到很多帖子说要使用 cflags_cc
,我也是,但它只是添加它,而不是替换它,因此我依赖的 c++17 功能没有编译。
你知道我做错了什么吗?
已解决。在 gcc 命令行上附加 c++ 标准确实有效——它遵循最后一个标准。我遇到的问题是被拉入的自定义 c++ 库 - 不知何故 <iomanip>
header 未包含在内,所以一旦我包含在我的 binding.cpp 文件中,编译工作。