Windows 7上編譯MongoDB C++ Driver

要從Qt里面訪問MongoDB,Qt沒有提供MongoDB的Driver,只好用MongoDB官方的C++Driver了。看了MongoDB官方的描述之后,又在網(wǎng)上搜了一番,發(fā)現(xiàn)并沒有預(yù)編譯好的版本,沒有辦法,只能自己動(dòng)手編譯了。看到了好多關(guān)于編譯這個(gè)Driver的Blog,上面的方法都很復(fù)雜,要用scons,要用boost,還有的人要?jiǎng)邮志幾gboost并給出參考頁面,頓時(shí)心里涼了半截。看到官方文檔上的描述,似乎最近的版本編譯的方法略有簡單的趨勢,只要按照官方文檔一步一步來了。

編譯環(huán)境

  • Windows 7 SP1 64位
  • VS2010 (vc10)
  • Python 2.7.3
  • MongoDB C++ Driver legacy 1.0.0-rc0

編譯過程

  1. 要有Python環(huán)境。我的機(jī)器上一直使用的Python 2.7.3,所以就不用再裝了。要保證python在環(huán)境變量中。

  2. 安裝scons。下載scons的源碼(很好找),解壓開里面有setup.py文件,使用命令:

     python setup.py install
    

就可以安裝成功了。這里也要保證命令行能訪問到scons命令,即Python27\Scripts目錄也要在環(huán)境變量中。

  1. 安裝boost。看文檔上說用1.55的版本,而且直接使用預(yù)編譯好的庫就行了。這里要給32位的程序用,所以下載32位的版本boost_1_55_0-msvc-10.0-32.exe(http://sourceforge.net/projects/boost/files/boost-binaries/1.55.0-build2/)。注意要對應(yīng)編譯器的版本。下載完以后解壓開,我把它解壓在 D:\programs\boost_1_55_0,所需要的頭文件都在boost下面,庫文件都在lib32-msvc-10.0文件夾下面。

  2. 下載MongoDB C++ Driver的源碼。我選擇的是legacy1.0.0-rc0版本,所以直接把這個(gè)git庫(https://github.com/mongodb/mongo-cxx-driver/releases/tag/legacy-1.0.0-rc0)clone下來就行。然后從命令行進(jìn)入該文件夾,準(zhǔn)備編譯。我放在了D:\programs\mongodb\mongo-cxx-driver-legacy-1.0.0-rc0下面。

  3. 編譯命令,來自官方文檔:

     Building a DLL (New in version 2.5.5)
     
     scons
         <--64 or --32>
         --sharedclient
         --dynamic-windows
         --prefix=<install-path>
         --cpppath=<path-to-boost-headers>
         --libpath=<path-to-boost-libs>
         install
    
     The following example will build and install the C++ driver, in a PowerShell:
     
     scons
         --64
         --sharedclient
         --dynamic-windows
         --prefix="%HOME%\mongo-client-install"
         --cpppath="C:\local\boost_1_55_0\include"
         --libpath="C:\local\boost_1_55_0\lib64-msvc-12.0"
         install
    

官方文檔上解釋了很多很詳細(xì),但還是有坑,這里我寫成這樣:

scons
    --32
    --sharedclient
    --dynamic-windows
    --prefix="D:\programs\mongodb\mongo-client-install"
    --cpppath="D:\programs\boost_1_55_0"
    --libpath="D:\programs\boost_1_55_0\lib32-msvc-10.0"
    --dbg=on

注意幾點(diǎn):

  • install不能加,否則會(huì)報(bào)錯(cuò)。編譯完成后頭文件和庫文件都會(huì)放在--prefix指定的路徑下面。
  • 要編譯兩次。一次release版不要加--dbg=on,一次是debug版要加。編譯結(jié)果是兩套庫。我編譯出來的庫如下圖所示:


    編譯出來的庫
    編譯出來的庫

代碼示例

好了,庫都有了,終于可以開發(fā)了。貼一小段代碼用于測試:

#include <cstdlib>
#include <iostream>
#include <winsock2.h>  
#include "mongo/client/dbclient.h" // for the driver

void run() {
    mongo::DBClientConnection c;
    c.connect("192.168.1.2");
}

int main() {
    mongo::client::initialize();
    try {
        run();
        std::cout << "connected ok" << std::endl;
    } catch( const mongo::DBException &e ) {
        std::cout << "caught " << e.what() << std::endl;
    }
    getchar();
    return EXIT_SUCCESS;
}

這里還是有坑啊!

  • #include <winsock2.h>這個(gè)頭文件在Windows上必須加,否則會(huì)報(bào)錯(cuò):"You must include the windows and windows sockets headers before dbclient.h"。

  • 這里如果和現(xiàn)有的工程結(jié)合的話,還有一個(gè)經(jīng)典的問題要解決:winsock.h和winsock2.h沖突,類型重定義。這個(gè)網(wǎng)上有很多解決辦法了,解釋的比較好的算是這一個(gè):http://www.cppblog.com/tx7do/archive/2008/04/20/47654.html

  • 在vc工程中把頭文件和庫文件都要設(shè)置好,包括boost和MongoDB C++ Driver的頭文件和庫,這個(gè)是vc開發(fā)的基本要求,就不多說了。我鏈接的庫如下:

      mongoclient.lib
      mongoclient-gd.lib
      boost_thread-vc100-mt-1_55.lib
      boost_system-vc100-mt-1_55.lib
      boost_regex-vc100-1_55.lib
    

到這里就結(jié)束了,感覺沒個(gè)別博客中說的那么復(fù)雜,可能官方也在不斷的改進(jìn)。如果那么復(fù)雜才能用起來,那么肯定會(huì)用的人越來越少。希望以后直接有個(gè)安裝包就好了。關(guān)于怎么用,請參考鏈接2吧。

參考

  1. https://github.com/mongodb/mongo-cxx-driver/wiki/Download%20and%20Compile#choose-a-branch
  2. https://github.com/mongodb/mongo-cxx-driver/wiki/Tutorial
  3. http://docs.mongodb.org/manual/applications/drivers/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,677評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內(nèi)容