zoukankan      html  css  js  c++  java
  • 在Windows下开发Node.js的C/C++原生扩展

    准备工作

    (1)本机系统说明:本人机器为win7 64位,32位也可以。

    (2)软件安装:

      VISUAL C++ 2010 EXPRESS(Visual Studio 2010也可以);

      windows下安装NodeJS,可以从官网http://www.nodejs.org下载msi版进行快捷安装;

    (3)源码准备:从官网下载Source Code版本node-v0.10.5.tar(笔者下载时的最新代码版本为v0.10.5),解压到windows任意目录下,如D: ode-v0.10.5。

    编写node的C/C++原生扩展

    [1]打开Windows命令行cmd.exe,进入D: ode-v0.10.5,执行vcbuild.bat release,最后会在D: ode-v0.10.5Release目录下可以找到编译好的node.exe、node.lib等文件。

    [2]制作编译安装批处理文件,此处命名为nodins.bat,文件内容如下:

    复制代码
    @echo off
    if "%1"=="" goto help
    mkdir "%1"
    mkdir "%1"include
    
    copy /y src
    ode.h "%1"include
    copy /y src
    ode_object_wrap.h "%1"include
    copy /y src
    ode_buffer.h "%1"include
    copy /y src
    ode_version.h "%1"include
    
    copy /y depsv8include*.h "%1"include
    
    copy /y depsuvinclude*.h "%1"include
    
    mkdir "%1"includeuv-private
    copy /y depsuvincludeuv-private*.h "%1"includeuv-private
    
    mkdir "%1"includeev
    copy /y depsuvsrcev*.h "%1"includeev
    
    mkdir "%1"includec-ares
    copy /y depsuvincludeares.h "%1"includec-ares
    copy /y depsuvincludeares_version.h "%1"includec-ares
    
    mkdir "%1"lib
    copy /y Release
    ode.lib "%1"lib
    
    copy /y Release
    ode.exe "%1"
    
    echo =================================
    echo Install succeefully!
    goto exit
    
    if not errorlevel 0 echo Error "install-path" & goto exit
    
    :help
    echo nodins.bat install-path
    
    :exit
    复制代码

    [3]打开Windows命令行cmd.exe,切换 进入D: ode-v0.10.5目录。将文件nodins.bat拷贝到D: ode-v0.10.5中,在命令行执行:nodins.bat D: odejs,则生成编译C/C++扩展的编译环境(包括头文件、库和可执行文件)D: odejs目录,内容如下:

    [4]用Visual Studio 2010创建一个DLL工程空白工程hellonode放在D:目录下,新建项目—>win32控制台程序,然后进入如下页面:

    [5]创建一个C++文件如hellonode.cpp,代码如下:

    复制代码
    #define BUILDING_NODE_EXTENSION
    #include <node.h>
    
    using namespace v8;
    
    Handle<Value> Hello(const Arguments& args) {
      HandleScope scope;
      return scope.Close(String::New("Hello world!"));
    }
    
    Handle<Value> Add(const Arguments& args) {
      HandleScope scope;
    
      if (args.Length() < 2) {
        ThrowException(Exception::TypeError(String::New("Wrong number of arguments")));
        return scope.Close(Undefined());
      }
    
      if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
        ThrowException(Exception::TypeError(String::New("Wrong arguments")));
        return scope.Close(Undefined());
      }
    
      Local<Number> num = Number::New(args[0]->NumberValue() +
          args[1]->NumberValue());
      return scope.Close(num);
    }
    
    void init(Handle<Object> target) {
      NODE_SET_METHOD(target, "hello", Hello);
      NODE_SET_METHOD(target, "add", Add);
    }
    
    NODE_MODULE(hellonode, init)
    复制代码

    [6]在工程属性的配置属性-常规中将输出目录改为.; 

    [7]在工程属性的配置属性-常规中将目标文件扩展名改为.node; 

    [8]在工程属性的配置属性-C/C++-常规-附加包含目录添加头文件目录为:D: odejsinclude 

    [9]在工程属性的配置属性-链接器-常规-附加库目录添加目录:D: odejslib 

    [10]在工程属性的配置属性-链接器-输入-附加依赖项添加lib库:node.lib 

    [11]编译生成后在D:hellonodehellonode中生成一个文件hellonode.node;

    [12]在D:hellonode目录创建js测试代码test.js,代码如下:

    var addons = require('./hellonode');
    console.log('C/C++ addons.hello() =', addons.hello());
    console.log('C/C++ addons.add(200, 300) =', addons.add(200, 300));

    [13]在命令行执行node . est.js(若未配置node.exe的路径变量,则执行:D: odejs ode . est.js),显示:

    编译生成可能遇到的问题

    [1]fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突

    原因:win7下的64位系统,在运行程序的时候,需要的DLL必须是64位系统编译的,VS2010也必须在安装的时候,选择了32位编译的支持。如果安装的时候,已经选择了,那么出现该问题的解决办法:

          (1)右键项目名,点击属性,弹出项目属性页,找到链接器----高级,修改右侧的目标计算机,选择有X64的那个选项。

          (2)右键项目名,选择清理解决方案,清理完之后选择X64平台编译器,然后重新生成解决方案,便可以调试成功。选择X64平台编译器如下图:

             

    如果如果在选择平台的下拉列表里找不到x64,则说明系统没有安装支持64位编译,则可以找VS安装文件进行增量安装。

    [2]fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    安装多个VS版本会 出现这个问题,解决方法一般如下:

    a)微软官方给出的具体解决方法是给VS2010打SP1补丁,下载地址如下:http://www.microsoft.com/zh-cn/download/details.aspx?id=23691.安装完重新生成,如果不行,试下一方法。

    b)微软官方的l另一个解决方案:http://support.microsoft.com/kb/320216/zh-cn。发现是嵌入清单的问题,于是对该工程以及所有依赖工程进行如下操作:

    右键->工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否]。rebuild 之,成功解决。

    附上代码http://files.cnblogs.com/CodeGuy/code.zip

  • 相关阅读:
    Alcatraz的安装和使用
    TableView didSelectRowAtIndexPath 不执行
    iphone6 plus 为什么打印出的宽度是375
    GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
    strcmp传入nil导致崩溃
    修改工程名称
    Mac OS X 系统12个常用的文本编辑快捷键(移动、选中)
    删除配置文件解决OS X各种WiFi无法连接的顽固问题,解决MAC无法连接wif的情况 Preferences
    textViewDidChange: crashes in iOS 7
    iOS7隐藏状态栏 statusBar
  • 原文地址:https://www.cnblogs.com/fuland/p/3632772.html
Copyright © 2011-2022 走看看