本文記錄了一些mongodb cxx driver的編譯與測試過程。使用的主要編譯工具為VS2010 Express,項目文件使用了源代碼自帶的scons和後來自建的qmake版的項目文件。均可順利編譯。scons版的mongoclient.lib在鏈接某些測試例子時有問題,qmake版的則沒有問題。另,Ubuntu下盡管沒有鏈接成功,由於暫時不計劃使用,故沒有深究。
一、下載mongodb cxx driver源代碼包編譯
下載路徑:http://dl.mongodb.org/dl/cxx-driver/
提示:不要管文件名中含有linux,實際上是跨平台的。
1)ubuntu10.10下編譯:使用scons。編譯不成功,找不到boost相關lib文件。但這些庫文件的確已經安裝(boost1.42.0),未做進一步處理。
2)winxp下編譯:創建.pro文件,在QtCreator中使用VS2010編譯不過。主要問題是assert, wassert, uassert等宏找不到。但assert在pch.h文件中有定義卻提示找不到。
該問題已經解決:原因是編譯選項不對,參考SConstruct文件來設置編譯選項。
二、從github.com下載源代碼編譯:
(用VS2010編譯的官方說明:http://www.mongodb.org/display/DOCS/Building+with+Visual+Studio+2010)
1)下載預編譯的boost包,安裝到c:/boost目錄
http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032
安裝到c:/boost目錄。可能需要lib拷貝:C:\boost\lib\vs2010_32\*.lib -> C:\boost\lib\。使用scons時無需拷貝lib
2)下載預編譯的SpiderMonkey包,安裝到mongo之../js。下載路徑見官方說明鏈接。
3)下載源代碼並使用scons編譯mongodb driver
C:\dev> git clone https://github.com/mongodb/mongo.git
C:\dev> cd mongo
C:\dev\mongo>git tag -l
C:\dev\mongo>git checkout r2.0.0
C:\dev\mongo>scons mongoclient.lib
最後編譯成功:mongoclient.lib [158 MB (165,892,750 字節)]。
4)或者使用qmake來編譯,可參考SConstruct文件來創建qmake版的項目文件.pro。
三、測試mongodb
1) 創建數據庫目錄:c:/data/db/
2) 啟動服務mongod:exe文件可以從mongodb網站下載到。
c:/dev/tools/mongodb/bin/mongod.exe --rest
3) 測試1:打開web客戶端:http://localhost:28017/
4) 測試2:使用源代碼裡的例子編譯後進行測試。
【問題與解決】
1)編譯某些例子時,提示mongo::toUtf8String找不到。具體錯誤為:
:-1: 錯誤:LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl mongo::toUtf8String(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (?toUtf8String@mongo@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@3@@Z) referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl mongo::errnoWithDescription(int)" (?errnoWithDescription@mongo@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)
解決:
i) 打開c:/dev/mongo/SConstruct,在575行插入下述行:
env.Append( CPPDEFINES=[ "_WIN32" ] ) # added by dou 20111015. for std::string toUtf8String(const std::wstring& wide) in util/text.cpp
然後再次編譯。某試了一次,似乎不起作用。後改為自建pro文件,然後使用qmake編譯。
ii) 使用qmake編譯。根據SConstruct中的定義來創建。
2)qmake編譯動態庫版時有幾個鏈接錯誤(即未加CONFIG += staticlib時)
解決:未解決,無需動態庫,改為靜態鏈接。即添加:CONFIG += staticlib
3)編譯發行版時,盡管安裝了預編譯版的boost庫,仍提示boost的lib文件找不到(與預編譯的不一致):需要靜態庫版,卻自動鏈接動態庫版。
解決:編譯選項問題,確認使用了/MT編譯選項。/MD是動態鏈接,需去掉。
【其它參考】
SQL to Shell to C++
http://www.mongodb.org/pages/viewpage.action?pageId=21270051