在Windows下编译安装Node.js和开发C/C++原生扩展(Nodejs相关)

在Windows下编译安装Node.js和开发C/C++原生扩展(Nodejs相关)

加油啊!再搞一篇linux下的C/C++原生扩展开发吧。

9 回复

在 Windows 下编译安装 Node.js 和开发 C/C++ 原生扩展

在 Windows 系统上编译安装 Node.js 并开发 C/C++ 原生扩展是一个常见的需求。下面将详细介绍如何完成这一过程。

编译安装 Node.js

  1. 下载源码 首先,从 Node.js 的 GitHub 仓库下载源码:

    git clone https://github.com/nodejs/node.git
    cd node
    
  2. 安装依赖 使用 vcbuild.bat 脚本来安装必要的依赖。确保你已经安装了 Visual Studio,并且配置好了环境变量。

    vcbuild.bat
    
  3. 编译 Node.js 使用 vcbuild.bat 来编译 Node.js:

    vcbuild.bat release
    

    这会生成一个可执行文件 node.exe

  4. 安装 Node.js 将编译好的 node.exe 和其他必要的文件复制到你的系统路径中,例如 C:\Program Files\nodejs

开发 C/C++ 原生扩展

假设你已经有一个 Node.js 环境,并希望开发一个简单的 C/C++ 扩展。

  1. 创建项目结构 创建一个新的目录来存放你的扩展文件,例如 my-addon,并在其中创建以下文件:

    my-addon/
    ├── binding.gyp
    ├── addon.cc
    └── index.js
    
  2. 编写 binding.gyp 文件 binding.gyp 是一个构建配置文件,定义了如何编译你的扩展。例如:

    {
      "targets": [
        {
          "target_name": "addon",
          "sources": [ "addon.cc" ]
        }
      ]
    }
    
  3. 编写 addon.cc 文件 这是你的 C++ 代码文件。例如,实现一个简单的加法函数:

    #include <node.h>
    #include <v8.h>
    
    using namespace v8;
    
    Handle<Value> Add(const Arguments& args) {
      HandleScope scope;
      int a = args[0]->Int32Value();
      int b = args[1]->Int32Value();
      return scope.Close(Integer::New(a + b));
    }
    
    void Init(Handle<Object> exports) {
      exports->Set(String::NewSymbol("add"),
        FunctionTemplate::New(Add)->GetFunction());
    }
    
    NODE_MODULE(addon, Init)
    
  4. 编写 index.js 文件 创建一个 JavaScript 文件来加载和使用你的扩展:

    const addon = require('./build/Release/addon');
    
    console.log(addon.add(5, 3)); // 输出 8
    
  5. 构建扩展 在命令行中运行以下命令来构建扩展:

    node-gyp configure build
    
  6. 测试扩展 运行你的 JavaScript 文件以测试扩展是否正常工作:

    node index.js
    

通过以上步骤,你可以在 Windows 系统上成功编译安装 Node.js 并开发 C/C++ 原生扩展。如果你有兴趣了解 Linux 下的开发流程,可以参考类似的步骤进行操作。


为毛我下的源码没有 deps\uv\src\ev\ 这个目录?

谢谢分享,昨天成功编译。 补充一下,还需要安装Python2,node-v0.6.15没有deps\uv\src\ev目录。

Visual Studio 好大 好可怕

请问一下楼主,您是怎么知道这些信息的。在官方文档里貌似没有啊

这只能说明楼主之前是做c开发的

我刚才对楼主的文章进行了补充:http://cnodejs.org/topic/527de7ced2b3893f2a13ac34

我在使用VS2017 编译node v8.11.2 的时候。在控制台输入 vcbuild.bat 命令,运行结束后。在生成的Release 目录下并没有生成node.exe , 在输入的日志里只发现了 “MSBUILD : error MSB4166: 子节点“2”过早退出。正在关闭。可以在临时文件目录中名为 MSBuild_*.failure.txt 的文件内找到诊断信息。” 这个错误信息,但是我想找这个文件,在win里全局搜索,但是没有找到。求解

在Windows下编译安装Node.js并开发C/C++原生扩展涉及几个步骤。以下是详细的指南和一些示例代码。

安装Node.js

  1. 下载Node.js: 访问Node.js官网,下载适合Windows系统的安装包。

  2. 安装Node.js: 运行下载的安装包,选择合适的路径进行安装。安装过程中可以选择添加环境变量。

  3. 验证安装: 打开命令提示符,输入 node -vnpm -v 查看Node.js和npm的版本号。

开发C/C++原生扩展

创建项目结构

假设我们要创建一个名为 myaddon 的原生扩展模块:

myaddon/
├── binding.gyp
└── src/
    └── myaddon.cc

编写 binding.gyp 文件

binding.gyp 文件定义了编译规则:

{
  "targets": [
    {
      "target_name": "myaddon",
      "sources": [ "src/myaddon.cc" ]
    }
  ]
}

编写 myaddon.cc 文件

myaddon.cc 是实际的C++代码文件:

#include <node.h>
#include <v8.h>

using namespace v8;

void Add(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = Isolate::GetCurrent();
  HandleScope scope(isolate);

  int a = args[0]->Int32Value(isolate->GetCurrentContext()).ToChecked();
  int b = args[1]->Int32Value(isolate->GetCurrentContext()).ToChecked();
  int c = a + b;

  args.GetReturnValue().Set(Number::New(isolate, c));
}

void Initialize(Local<Object> exports) {
  NODE_SET_METHOD(exports, "add", Add);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize)

编译扩展

  1. 安装必要的工具: 确保你已经安装了Python和Visual Studio Build Tools。

  2. 运行编译命令: 在命令提示符中,进入项目根目录,运行以下命令:

    node-gyp configure build
    
  3. 测试模块: 创建一个简单的JavaScript文件来测试你的C++扩展:

    const myaddon = require('./build/Release/myaddon');
    
    console.log(myaddon.add(5, 3)); // 输出: 8
    

以上步骤详细介绍了如何在Windows系统下安装Node.js以及如何编写、编译和使用C/C++原生扩展。

回到顶部