windows下編譯node-sqlite


nodejs以輕量化、高效為特點日益深入我心。但在nodejs 0.10下沒有在原生的數據庫。最近在考慮實現數據持久化時准備使用數據庫,初步准備使用sqlite。

nodejs下sqlite庫。可以使用npm install node-sqlite安裝。但在windows下無法安裝。順便說下,有的人說nodejs是在linux下用的,windows下可以不用考慮。但你要知道,windows下用戶是最多,什么時候我們也不能把最多數的用戶忘了。查找下相關資料,無法安裝是因為沒有node-sqlite的windows二進制安裝文件,安裝時需要編譯。在這里描述了如何在windows下編譯node-sqlite。但在實際上感覺還是有許多不同。這里記錄下來,給后來的各位借鑒下。
首先要安裝vc express,它是編譯器,沒有它就沒法編譯了。我下載的是2010版。安裝方式有兩種,一種是網絡安裝,從這里下載運行后,會下載真正的安裝文件,大概要1個多小時。還可以離線安裝版,在這里,大約1G多。這個是express的合集,可有選擇地安。
然后在這里下載node的編譯版,注意不是安裝版。然后運行里面的vcbuild.bat,生成可鏈接版。
這里下載node-sqlite的windows版。這一版本里沒有gyp,所以不能直接編譯。需要人工通過express 2010界面的方式編譯。
首先將deps下的sqlite-autoconf-3070800.tar.gz文件解壓到sqlite3下。

然后設定參數。設定參數可以兩種方式,一種直接編輯node_extension.SAMPLE.props,然后改名為node_extension.props。一種是將node_extension.SAMPLE.props直接改名為node_extension.props。然后打開node-sqlite3.sln。在node-sqlite3的屬性頁中,修改c/c++/常規/附加包含目錄,把包含node.h的目錄添加上。node.h不知道在哪里?下載的node編譯版里有,在node下的\src\里。下面是和說明不一樣的。還要添加,uv.h和v8.h,分別在node下的\deps\uv\include和\deps\v8\include。在node-sqlite3的屬性頁中,鏈接器/常規/附加庫目錄中添加node.lib的目錄。

最后開始build。然后會一大堆錯誤:

1>d:\sqlite-win\node-sqlite3-windows\src\statement.cc(121): error C2664: “uv_queue_work”: 不能將參數 4 從“void (__cdecl *)(uv_work_t *)”轉換為“uv_after_work_cb”
1> 在匹配目標類型的范圍內沒有具有該名稱的函數
這樣的可以將&baton->request, Work_Prepare, Work_AfterPrepare改為&baton->request, Work_Prepare, (uv_after_work_cb)Work_AfterPrepare

還有要將macros.h中的&baton->request, Work_##type, Work_After##type)改為&baton->request, Work_##type, (uv_after_work_cb)Work_After##type)

但在鏈接時還會出現錯誤:

1>------ 已啟動生成: 項目: node_sqlite3, 配置: Debug Win32 ------
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(299,5): warning MSB8004: Output 目錄未以斜杠結尾。此生成實例將添加斜杠,因為必須有這個斜杠才能正確計算 Output 目錄。
1> 正在創建庫 D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.lib 和對象 D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.exp
1>database.obj : error LNK2001: 無法解析的外部符號 "class v8::Isolate * node::node_isolate" (?node_isolate@node@@3PAVIsolate@v8@@A)
1>statement.obj : error LNK2001: 無法解析的外部符號 "class v8::Isolate * node::node_isolate" (?node_isolate@node@@3PAVIsolate@v8@@A)
1>D:\sqlite-win\node-sqlite3-windows\\lib\node_sqlite3.node : fatal error LNK1120: 1 個無法解析的外部命令
========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========

我估計是鏈接時的錯誤,查找下相關文件,在node.cc中"class v8::Isolate * node::node_isolate"有定義:

// Declared in node_internals.h
Isolate * node_isolate = NULL ;
 
在node_internals.h也發現如下內容:
namespace node {
 
// Defined in node.cc
extern v8 :: Isolate * node_isolate ;
 
但不知道為什么會出鏈接錯誤,請哪位C/C++方面的高人請指教下。成功編譯后就可以安裝了。


免責聲明!

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



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