2

我已经在 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)

我的绑定.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'
        ]
      }
    }
  ]
}

我尝试在全局空间和条件下添加到 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 特性没有编译。

关于我做错了什么的任何想法?

4

1 回答 1

1

这解决了。在 gcc 命令行上附加 c++ 标准确实有效 - 它遵循最后一个。我遇到的问题是被拉入的自定义 c++ 库 - 不知何故,<iomanip>没有包含标题,所以一旦我包含在我的 binding.cpp 文件中,编译就可以工作了。

于 2019-09-20T15:48:14.143 回答