windows下編譯node-sqlite

來源:互聯網
上載者:User

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.hIsolate* node_isolate = NULL; 在node_internals.h也發現如下內容:namespace node { // Defined in node.ccextern v8::Isolate* node_isolate; 但不知道為什麼會出連結錯誤,請哪位C/C++方面的高人請指教下。成功編譯後就可以安裝了。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.