【问题标题】:how I run node-gyp?我如何运行 node-gyp?
【发布时间】:2015-07-31 12:00:25
【问题描述】:

我点击这个链接:http://www.swig.org/Doc3.0/Javascript.html#Javascript_running_swig 制作nodejs扩展名。所以我创建了一个包含example.c的文件夹test

    #include <time.h>
 double My_variable = 3.0;

 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }

 int my_mod(int x, int y) {
     return (x%y);
 }

 char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }

example.i:

 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}

 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

binding.gyp:

    {
  "targets": [
    {
      "target_name": "example",
      "sources": [ "example.cxx", "example_wrap.cxx" ]
    }
  ]
}

我运行这个命令:

sudo npm install -g node-gyp

然后:

swig -javascript -node -c++ example.i

然后:

node-gyp configure

当我运行 node-gyp build 时出现以下错误:

    gyp info it worked if it ends with ok
gyp info using node-gyp@2.0.2
gyp info using node@0.12.7 | linux | ia32
gyp info spawn make
gyp infomake: Entering directory `/home/slim/test/build'
make: *** No rule to make target `Release/obj.target/example/example.o', needed by `Release/obj.target/example.node'.  Stop.
make: Leaving directory `/home/slim/test/build'
 spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:269:23)
gyp ERR! stack     at ChildProcess.emit (events.js:110:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:1074:12)
gyp ERR! System Linux 3.13.0-32-generic
gyp ERR! command "node" "/usr/bin/node-gyp" "build"
gyp ERR! cwd /home/slim/test
gyp ERR! node -v v0.12.7
gyp ERR! node-gyp -v v2.0.2
gyp ERR! not ok 

我在这个主题中找到了很多帖子,但它对我不起作用,我运行 npm -g install node-gyp 并在运行 node-gyp-build 但它不起作用。

【问题讨论】:

  • 我使用的是 ubuntu 12.04LTS,我有 python v 2.7.3
  • 那么你到底想要构建什么?你的binding.gyp 是什么样的?
  • 我点击此链接swig.org/Doc3.0/Javascript.html#Javascript_running_swig 使用 swig 制作了一个 nodejs 扩展
  • @robertklep:我编辑了帖子。

标签: node.js node-gyp


【解决方案1】:

binding.gyp 指的是两个源文件:

"sources": [ "example.cxx", "example_wrap.cxx" ]

example_wrap.cxx 由 Swig 生成,另一个包含您的代码。您似乎已将该文件命名为 example.c,因此 node-gyp 找不到它。解决方法:将example.c重命名为example.cxx。

由于您使用的是 Node 0.12,接下来您可能会遇到一堆复杂错误。如果是这样,请在编辑器中打开 example_wrap.cxx,搜索 SWIG_V8_VERSION 并将定义替换为:

#define SWIG_V8_VERSION 0x032873

您可以查看nan,而不是 Swig,这是创建 Node.js 插件的另一种方法。它运行良好(我有经验)并且有很多示例代码可用(node-native-boilerplate 是一个好的开始)。分发使用 nan 构建的插件也更容易,因为所有依赖项都是在常规的 npm install 过程中安装的(而对于 Swig,您必须依赖它在安装模块本身之前安装它)。

【讨论】:

  • 我在遇到你提到的那些“复杂错误”后才发现这个:) 正如你所标记的,使用#define SWIG_V8_VERSION 0x032873 解决了这些问题。但是这里发生了什么?为什么有必要把这个标志放在这里,有没有办法让它自动?
  • 在玩了 swig/node.js 之后,似乎 swig 无法处理返回数组的 C++ 函数(更准确地说:返回数组指针的函数)。也就是说,您似乎无法在 C++ 中构建一个返回类似 JavaScript 数组的函数并让 swig 自动为您转换它。
  • @George 我相信(不记得具体)将SWIG_V8_VERSION 设置为该特定值会使 Swig 输出代码在 Node 0.12(可能还有更高版本)上正确编译。通常,V8 C++ 语义在 Node.js 重大更新之间发生变化(0.10 → 0.12 → 4.x → ...),因此需要调整输出的代码。我不使用 Swig,所以不知道它是否可以自动化。
猜你喜欢
  • 2023-03-18
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2012-12-29
  • 2022-08-11
  • 2015-09-01
  • 2013-03-02
相关资源
最近更新 更多