准備工作
(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
