要從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
編譯過程
要有Python環(huán)境。我的機(jī)器上一直使用的Python 2.7.3,所以就不用再裝了。要保證python在環(huán)境變量中。
-
安裝scons。下載scons的源碼(很好找),解壓開里面有setup.py文件,使用命令:
python setup.py install
就可以安裝成功了。這里也要保證命令行能訪問到scons命令,即Python27\Scripts目錄也要在環(huán)境變量中。
安裝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文件夾下面。
下載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下面。
-
編譯命令,來自官方文檔:
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吧。