您的位置:首页 > 数据库 > Mongodb

MongoDB C++ 驱动在Ubuntu下的安装

2013-11-10 10:58 423 查看
之前写过一片MongoDB C++驱动在win64、VS2010的配置文章,算是勉强使用就版本来凑合。在从OpenCV在2.4.4开始有了自己的JNI,就把全部工作转移到JAVA里来完成,懒得去钻研C++ Driver了。最近因为矩阵运算导致速度太慢,想用C++来提高效率并尝试CUDA,在Ubuntu下又再次尝试编译C++的MongoDB驱动,在此记录。

写之前再次吐槽下10gen的Tutorial做的太差劲了。我的主要工作也依靠OpenCV。作为开源免费的视觉库,各种教程十分全面,所需类库清晰明了,还配合一些IDE有上手教程。相比之下Mongo据说融资不少,对编译配置却三言两语,把所有使用者都当成资深程序员了。

在下载编译MongoDB驱动之前,先说下所需的主要类库,这也是官方网站含糊不清,很多朋友可能犯错的地方。ubuntu下安装mongodb很简单,在上一篇已经说了,这里只讲C++驱动。

1. MongoDB是用C++写的,但生成软件并没有用传统的Cmake而是Python的Scons。在Ubuntu下很简单,版本也不那么重要了。

sudo apt-get install scons

2. MongoDB另一个依赖的主要类库就是Boost。作为功能强大、开源、同行审核的库,版本之间很容易混淆。去官方首页下载,推荐使用1.49。解压出来后里面有bootstrap.sh,在ubuntu下运行得到bjam、b2文件。在我之前Win下配置里用的是bjam,今天配置时网上看到最新版的用b2来安装(也有人用bjam安装成功)。这个安装过程比较长,虽然MongoDB只用其中几个功能,所以可以一一查找编译。更简单粗暴的方法就是全部编译出来(运行 ./b2),在/usr/local/lib下找到那写libboost_..文件算是编译成功了。

可以使用 ./b2
--show-libraries
来察看所有库,用 ./b2 install --with-<library name>来指定安装。

使用 ./b2会生成所需的库文件,用 sudo ./b2 install 可以吧文件放在默认的安装目录usr/local/lib下,也可以在配置文件中更改这个目录,使用sudo才有权限把文件放进去。

3. 终于到了MongoDB,去官网下载个单独的“standalone” C++驱动并解压出来,目前最新2.4.8,进入子目录下scons安装。没有安装成功多半是因为找不到Boost类库,应去寻找更多关于它的解决方法。若是编译成功,可以看到文件夹下有libmongoclient.a这个文件。

4. 至此安装步骤基本完成了,拿个编译器把官方的tutorial写个cpp,编译这一步也很容易出问题。官网给的例句:

g++ tutorial.cpp -pthread -lmongoclient -lboost_thread-mt -lboost_filesystem -lboost_program_options -lboost_system -o tutorial


tutorial.cpp是你的源文件名,-o和目标生成文件名,最后这个可以省略,会生成a.out来执行。这里重点说一下中间参数的mt,这些都是指boost生成的文件,但也许并没有mt相关生成。主要原因是在编译boost是有个with MPI的选项,是一个并行编程库,在编译boost时可以看到是否检测到,猜测应该在Boost之前安装。不过这里没有关系,没有MPI的编译结果就是省略了这个多线程选项mt,把-mt都去掉后就可以找到我们的文件了。
第二点是例子中的include /monogo/client/dbclient.h 所以在编译时应该指定该位置,在cpp文件名后用(大写i)I来包括

g++ tutorial.cpp -I ~/mongo/src/ ~/mongo/libmongoclient.a -lboost_thread -lboost_filesystem -lboost_program_options -lboost_system -o tutorial

改完后大概是这个样子,假定你的驱动目录在用户跟目录下叫mongo。这样编译应该可以有结果了,但很可能运行会出现找不到boost类库的问题,是因为并没有把/usr/local/lib/加入配置文件,系统找不到。在网上找到的解决方案是:

sudo gedit /etc/ld.so.conf


and add
/usr/local/lib


Then run
sudo ldconfig

我用不惯vim就用gedit打开,在最后加入boost库所在路径,重新在如配置文件。至此运行./tutorial应该可以正确运行了。

这里还有一个潜在问题,如果想用多线程的话,是否就需要mpi编译出带mt的文件呢??在mongo官网的解释说最近版本可以不用这个参数了,而Mongo本身是线程安全的,感觉应该是不用我们担心这个问题了。过两天会试下多线程,再给大家答案。

在OpenCV的JNI中,我遇到了多线程和CascadeClassifier导致JVM崩溃的bug。抓狂很久找到了大概解决办法,在下篇博客会写出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: