標籤:mongodb
1、導言
折騰mongodb幾個小時終於有結果了。呃!現在就簡單總結一下。
其實我的需求很簡單,就是在C++代碼中調用mongodb的庫函數,也就是要得到mongoclient.lib。本來想直接下載個,可在網上也沒找到,覺得重新編譯也不麻煩,於是就下了源碼編譯。可下錯了源碼,編了半天也編不出來,暈!
其實就是參考了網友們的文章,在這裡下載了源碼mongodb-src-r2.6.3.zip。編譯命令也很簡單,大家都說直接輸入:scons mongoclient.lib即可,可不斷彈出這樣的錯誤:
scons: *** Do not know how to make File target `mongoclient.lib‘ (C:\mongo-maste
r\mongoclient.lib). Stop.
結果不知道怎麼發現mongoclient.lib在新版本中不再是target了,已經移到了另一個源碼mongo-cxx-driver-legacy.zip中了,地址在這裡。不過,在mongo-src中,像mongo,mongod還是直接可以編譯成功的,貌似不需要boost庫
2、準備工作
2.1 下載安裝mongo-win32.msi
為了節約時間,我就直接下載了相關exe檔案像mogo.exe,mogod.exe
2.2 依次安裝python,scons,boost
詳細資料可參考我給出的連結地址。我就強調一些我發現的:
2.2.1 有人說mongoclient只連結boost靜態庫,我發現不是這樣,當指定--dynamic-windows,--sharedclient參數後,需要給出boost動態lib庫目錄,而非*-s.lib
2.2.2 當未指定指定--dynamic-windows,--sharedclient參數時,貌似不用給出boost庫目錄,我也不太確定,反正我是沒給出像libboost_date_time-vc110-mt-s-1_53.lib等檔案的路徑
3、編譯mongoclient
從vs2012命令列中進入mongo-cxx-driver-legacy目錄,執行:
scons install-mongoclient --cpppath=boost標頭檔路徑
結果在build\install\lib直接產生libmongoclient-s.lib,128M
當然也可添入--dynamic-windows,--sharedclient,--dbg等參數,可產生對應的動態庫,包括調試版和發行版。詳細說明可看這裡。結果我的目錄裡有以下檔案:
說實話,我是真沒搞清楚這些檔案的區別,我已經淩亂了……
4、測試
我不得不說,這一步也走得真懸,竟有兩個重要步驟被我猜准了。。
本來代碼很簡單,就串連上mongod.exe進程開啟的伺服器就行,也不知道怎麼回事,網友們都沒有我說得那兩個步驟,莫非是新版本更新的問題,抑或我忽視了一些東西?
代碼如下:
#include <iostream>#include <cstdlib>#include <winsock2.h>#include "mongo\client\dbclient.h"using namespace std;void run(){mongo::DBClientConnection con;con.connect("127.0.0.1:27017");}int main(){WSAData wsaData;if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0){return -1;} try{run();cout << "conn ok" << endl;}catch (const mongo::DBException &e){cout << "caught " << e.what() << endl;}getchar();return EXIT_SUCCESS;}
在運行之前,不用說,肯定要添加boost和mongoclient的標頭檔和庫檔案。注意我添加的都是動態庫Lib路徑,應該是動態連結的,所以也需要將boost的dll路徑和mongoclient-gd.dll路徑添加進PATH中,且還要添加ws2_32.lib庫,至於boost庫和mongoclient庫可直接寫目錄而不用寫庫名,因為有自動連結機制。
下面就說我的兩個重大修改,只是相比於網友們的檔案:
1、在dbclient.h標頭檔之前添加winsock2.h,因為在vs2012中如果不加會報錯:"You must include the windows and windows sockets headers before dbclient.h"
2、在main函數開頭,我添加了WSAStartup的5行代碼,因為如果不添加,在某一個檔案中的getAddr調用會異常:"WSAStartup() failed"
不能說常規代碼錯了,只能說由於各種原因,在這種情況下需要這麼做才會編譯運行正常。
運行就簡單了,首先啟動mogod -dbpath d:\data,預設連接埠在27017,然後啟動上面的用戶端,輸出conn ok。Done !
5、參考網址
http://blog.csdn.net/mniwc/article/details/8590528
http://ppgunjack.iteye.com/blog/985904
http://database.51cto.com/art/201106/272526.htm
mongodb及mongoclient在win7下的編譯和使用