在Windows下開發NodeJS的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:\node-v0.10.5。

編寫node的C/C++原生擴展

[1]打開Windows命令行cmd.exe,進入D:\node-v0.10.5,執行vcbuild.bat release,最后會在D:\node-v0.10.5\Release目錄下可以找到編譯好的node.exe、node.lib等文件。

[2]制作編譯安裝批處理文件,此處命名為nodins.bat,文件內容如下:

@echo off
if "%1"=="" goto help
mkdir "%1"
mkdir "%1"\include

copy /y src\node.h "%1"\include
copy /y src\node_object_wrap.h "%1"\include
copy /y src\node_buffer.h "%1"\include
copy /y src\node_version.h "%1"\include

copy /y deps\v8\include\*.h "%1"\include\

copy /y deps\uv\include\*.h "%1"\include\

mkdir "%1"\include\uv-private
copy /y deps\uv\include\uv-private\*.h "%1"\include\uv-private

mkdir "%1"\include\ev
copy /y deps\uv\src\ev\*.h "%1"\include\ev

mkdir "%1"\include\c-ares
copy /y deps\uv\include\ares.h "%1"\include\c-ares
copy /y deps\uv\include\ares_version.h "%1"\include\c-ares

mkdir "%1"\lib
copy /y Release\node.lib "%1"\lib

copy /y Release\node.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:\node-v0.10.5目錄。將文件nodins.bat拷貝到D:\node-v0.10.5中,在命令行執行:nodins.bat D:\nodejs,則生成編譯C/C++擴展的編譯環境(包括頭文件、庫和可執行文件)D:\nodejs目錄,內容如下:

 

[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:\nodejs\include 

[9]在工程屬性的配置屬性-鏈接器-常規-附加庫目錄添加目錄:D:\nodejs\lib 

[10]在工程屬性的配置屬性-鏈接器-輸入-附加依賴項添加lib庫:node.lib 

[11]編譯生成后在D:\hellonode\hellonode中生成一個文件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 .\test.js(若未配置node.exe的路徑變量,則執行:D:\nodejs\node .\test.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM