Node-gyp无法编译Node.js扩展(“致命错误,线程”文件未找到)

4

我有一个由同事制作的节点扩展,并尝试通过node-gyp configure进行编译(一切正常),然后进行node-gyp build致命错误,未找到'thread'文件)。现在,我相信这是gcc的问题,并且我在某个地方读到需要使用标志-stdlib=libc+++。我的binding.gyp文件如下:

{
    "targets": [
    {
        "target_name": "overcpu",
        "sources": [ "overcpu.cpp" ],
        "cflags" : [ "-stdlib=libc++" ]
    }
    ]
}

但我仍然收到错误信息。我安装了XCode和开发工具,不仅如此,我还通过brew安装了gcc。不幸的是,我仍然收到相同的错误。 通过执行gcc -v,我得到以下输出:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

我的gcc出了问题还是node-gyp(v1.0.1)让我发疯?

非常感谢!


如果您在插件目录中执行 node-gyp --loglevel=silly rebuild 命令,是否能看到编译/链接过程中命令行上设置了 cflags - mscdex
嗨,这里有很多日志,但我找不到任何地方设置了“cflags”。你能给我提示在哪里发生了吗?也许我错过了它。 - Masiar
1个回答

11

为了完全启用C++11支持,您还需要在cflags参数列表中添加-std=c++11

更新:特别针对OSX(cflags应该适用于BSD和Linux),您还需要在targets设置内部添加条件:

{
    "targets": [
    {
        "target_name": "overcpu",
        "sources": [ "overcpu.cpp" ],
        "cflags" : [ "-std=c++1", "-stdlib=libc++" ],
        "conditions": [
          [ 'OS!="win"', {
            "cflags+": [ "-std=c++11" ],
            "cflags_c+": [ "-std=c++11" ],
            "cflags_cc+": [ "-std=c++11" ],
          }],
          [ 'OS=="mac"', {
            "xcode_settings": {
              "OTHER_CPLUSPLUSFLAGS" : [ "-std=c++11", "-stdlib=libc++" ],
              "OTHER_LDFLAGS": [ "-stdlib=libc++" ],
              "MACOSX_DEPLOYMENT_TARGET": "10.7"
            },
          }],
        ],
    }
    ]
}

感谢您修改答案。现在线程错误似乎已经消失了,但是我收到了“致命错误:找不到'linux/unistd.h'文件”。我猜又是缺少某些标志了? - Masiar
这听起来好像代码可能不是跨平台的?不过,你只需将代码中的linux/unistd.h更改为unistd.h,就应该没问题了。 - mscdex
因此,编译时出现了与我在外部定义的__NR_gettid有关的问题。当我定义它(#if defined(OS_MACOSX) bla bla #endif)时,编译工作正常,但是从节点调用扩展时会出现“坏的系统调用:12”错误。 :-( - Masiar
也许我需要另一个标志来定义缺失的变量? - Masiar
在OSX上没有gettid,因此如果您的代码需要它,您必须找到是否有类似的东西或以跨平台的方式重写代码的那一部分。 - mscdex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接