1. 程式人生 > >Linux下編譯mongodb以及C++客戶端驅動

Linux下編譯mongodb以及C++客戶端驅動

想在Linux下編譯一下mongo和它的C++驅動,網上一堆教程,官方一堆文件,實現起來依舊困難重重。我就很納悶了,本來mongodb就是C++寫的,為什麼不直接提供出驅動,而java,C#之類的,倒是直接提供了jar包和dll檔案。今天終於編譯成功,趕緊記錄下來。

Linux版本:CentOS 5.4

C++驅動版本:mongo-cxx-driver-v2.2

Mongodb版本:mongodb-src-r2.2.6

Python版本:Python-2.7.5

scons版本:scons-src-2.3.0

boost版本:boost_1_49_0

步驟:

1. 升級boost

centos5.4自帶了boost,但版本過老,需要進行升級:
rpm -qa boost* # 先查一下安裝的版本
rpm -e xxxx # 解除安裝之

去boost官網下載boost庫,推薦1.49版本,注意,作者第一次下載了1.54版本的boost,後來在編譯C++驅動的時候,死活編譯不過去,出現error: #error Compiling Filesystem version 3 file with BOOST_FILESYSTEM_VERSION defined != 3的錯誤,Boost官網http://www.boost.org/doc/libs/1_51_0/libs/filesystem/doc/index.htm有這麼一段話:This is Version 3 of the Filesystem library. Version 2 is not longer supported. 1.49.0 was the last release of Boost to supply Version 2。
最後又重新安裝的1.49版本的。


下載boost_1_49_0.tar.bz2
解壓後,執行
$ cd boost_1_49_0
$ ./bootstrap.sh

$ ./b2

$ sudo ./b2 install

時間有點長,可以先出去抽個煙,上個廁所。

2.升級python

參考:http://www.netingcn.com/centos-python-upgrade.html

http://running.iteye.com/blog/1122370

3.安裝scons

下載scons-2.3.0-1.noarch.rpm ( http://www.scons.org/download.php )

安裝:

#rpm -uvh scons-2.2.0-1.noarch.rpm
4. 編譯mongodb

從官網上面下載mongo原始碼(http://www.mongodb.org/downloads),下載的版本是mongodb-src-r2.2.6.tar.gz

解壓縮之後生成mongodb-src-r2.2.6目錄,cd到這個目錄 然後執行命令: scons --prefix=/usr/local/mongo --full install 到時候會在/urs/local/mongo生成三個目錄bin,include,lib 其中: bin下包含mongo的服務端和客戶端,還有其他的一些工具 include是mongo的標頭檔案 lib是客戶端的庫,這裡生成的cpp的客戶端庫 注意,在這裡,lib目錄下並沒有生成期待的libmongoclient.a,這裡會出現一個錯誤,導致編譯的終止,但並不影響最終使用。編譯工作到此為止。libmongoclient.a生成到了mongodb-src-r2.2.6目錄下。手動把libmongoclient.a拷貝到lib下吧。
實際上這已經把C++客戶端驅動生成了。

5.編譯C++客戶端V2.2驅動

tar zxf mongodb-linux-x86_64-v2.2-latest.tgz
cd mongo-cxx-driver-v2.2
scons
scons install
ldconfig /usr/local/lib

安裝成功!

測試一下吧:

首先啟動mongo資料庫:

[[email protected] mongo]# cd /usr/local/mongo/bin
[[email protected] bin]# ./mongo
MongoDB shell version: 2.2.6
connecting to: test
Mon Oct 14 15:46:25 Error: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
exception: connect failed
[[email protected] bin]# ./mongod -dbpath=/usr/local/mongo/data/db
出現couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91 這個錯誤,我把資料庫檔案路徑定義在了
/usr/local/mongo/data/db下面,需要自己建data、db兩個資料夾。
啟動成功後,進入mongo-cxx-driver-v2.2目錄下的src目錄,建立一個測試檔案test.cpp
#include<cstdlib>
#include<iostream>
#include"mongo/client/dbclient.h"
void run(){
  mongo::DBClientConnection c;
  c.connect("localhost");}
int main()
{
try{
    run();
    std::cout <<"connected ok"<< std::endl;
}catch(const mongo::DBException&e ){
    std::cout <<"caught "<< e.what()<< std::endl;}
return EXIT_SUCCESS;
}
執行:g++ test.cpp -lmongoclient -lboost_thread -lboost_filesystem -lboost_program_options
生成a.out檔案
[[email protected] src]# ./a.out
./a.out: error while loading shared libraries: libboost_thread.so.1.49.0: cannot open shared object file: No such file or directory
[[email protected] src]# cd ..
[[email protected] mongo-cxx-driver-v2.2]# ldconfig /usr/local/lib
出現error while loading shared libraries: libboost_thread.so.1.49.0: cannot open shared object file: No such file or directory這個錯誤,是因為我沒有執行
ldconfig /usr/local/lib,執行完以後,再試一下:
[[email protected] src]# ./a.out 
connected ok
再試試mongodb自帶的例子,進入mongodb-src-r2.2.6/src/mongo/client/examples
[[email protected] examples]# g++ first.cpp -I /usr/local/mongo/include -L /usr/local/mongo/lib/libmongoclient.a -lmongoclient -lboost_thread -lboost_filesystem -lboost_program_options -o first
[[email protected] examples]# ./first
using cursor
        { "_id" : { "$oid" : "525bb336ab8ef21b5b7886db" }, "name" : "eliot", "num" : 15 }
        { "_id" : { "$oid" : "525bb336ab8ef21b5b7886dc" }, "name" : "sara", "num" : 23 }
0       { "_id" : { "$oid" : "525bb336ab8ef21b5b7886db" }, "name" : "eliot", "num" : 15 }
1       {}
[[email protected] examples]# 
成功了,現在你可以開始用c++編寫操作mongoDB的程式
參考文件:
http://lingzhi007.iteye.com/blog/1844127
http://blog.sina.com.cn/s/blog_77c35cff01018qzt.html
http://www.cnblogs.com/logicbaby/archive/2011/07/04/2097697.html
http://www.cnblogs.com/mobileinternet/archive/2012/08/31/2665144.html