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

VS2015编译连接mongodb(mongodb C++ driver)

2015-09-08 15:04 567 查看
忙活了好几天终于在VS2015下编译完成了mongodb C++ driver,连接成功一瞬间肉牛满面啊!!!程序猿的成就感就在代码成功的一瞬间哎。。。

先吐槽一下,我就是想简单的在VS2015下连接mongodb,结果编译一个driver整的这么难真的合适么。。。

一、编译c++ driver的背景知识:

需要用到python,scons,boost,参考文献:/article/8572374.html

VS连接mongodb需要首先编译mongo客户端,核心其实就是一个mongoclient.lib,用来连接mongodb服务器所需要的类库。

1.scons

scons是一个Python写的自动化构建工具,同linux的make工具功能相似。与之关联的SConstruct文件也即类似make工具的makefile文件,描述了编译和链接的内容和方式。在这里就是用scons这个工具来编译生成mongoclient.lib的(而不是用vs)。

2.python

Python是一种面向对象、直译式计算机程序设计语言。因为scons是用python写的那就肯定要用到它的库,所以在scons之前先装python。需要说明的是,安装scons需要python2.7版本,高于3.0版本会失败。

3.boost

一个很强大的C++库,mongodb是用C++写,使用到了这个库,所以需要它。

二、编译driver

1、第一步是安装python2.7,过程就省略了,我是默认安装在C:\盘的。打开cmd输入python如果显示没有这条命令的话,就在系统环境变量path里面添加一下就好,记得把python的script目录一起加进去。

2、安装scons,下载scons包,有很多文档指明了版本,其实试验下来我认为版本是没有要求的,我直接使用了最新版2.3.5。地址:http://sourceforge.net/projects/scons/files/scons/ 将下载的zip文件解压,我放置的目录是:E:\mongo-install,cmd切换到E:\mongo-install\scons-2.3.5下,运行python setup.py install来安装scons。



比较老的c++driver是通过mongodb的源码进行编译的,而现在是通过cxx-driver这个包进行编译的,scons版本我一共尝试了两个,图片里都有,我最后用的是2.3.5。

3、安装boost。下载boost,首先要说明的是,mongodb官方文档上建议使用的是编译好的boost库:



官方文档地址:https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver#get-the-source-code

但是网上很多教程其实用的不是预编译好的,而是下的boost文件自己编译的,我最终实现其实两者都用到了,具体为什么后面慢慢讲。官方文档中的预编译好的boost库其实是一个exe安装文件,选择安装位置之后会直接有各种库和dll,我的安装位置是C:\boost_1_59_0。在下载的时候要注意一点,选择和VS版本对应的VCtool,VS2015对应的是msvc-14.0,VS2013是msvc-12.0。

之所以还要从boost官方下载需要手动编译的版本,是因为后面连接mongodb的时候缺少了好几个msvc-12.0的dll,所以没办法我又下了boost_1_59_0的源码包自己编译,位置是c:\boost。





预编译的文件里面lib64-msvc-14.0里面就是预编译好的64位的库文件,有.lib和.dll。

如果需要自己编译的boost,打开VS->工具->VS命令提示(就是命令行),切换到boost目录,cd c:\boost,输入bootstrap,等待生成b2.exe和bjam.exe。如果下面第四步失败,则编译源码就需要他们。

4、下载mongo-cxx-driver-legacy,地址:https://github.com/mongodb/mongo-cxx-driver.git,解压到E:\mongo-install下,之后就一定要仔细看mongodb的官方文档了,里面有很详细的编译参数讲解,看懂了就基本上没问题了。



在c盘新建一个空文件夹mongo,存放编译的包含文件和库文件。打开cmd,切换到cxx-driver目录下,输入

scons –64 –sharedclient –dynamic-windows –prefix=”c:\mongo” –cpppath=”C:\boost_1_59_0” –libpath=”C:\boost_1_59_0\lib64-msvc-14.0” install

所有参数之前都是两道-,prefix表示的是要生成的包含文件和库文件的位置,cpppath就是boost位置,libpath是库文件位置。

按照官方文档的说明,其实要迭代的一共执行四个命令,分别是

scons ARGS install

scons ARGS install –dbg=on

scons ARGS install –dynamic-windows –sharedclient

scons ARGS install –dynamic-windows –sharedclient –dbg=on

args就是上面的prefix,cpppath和libpath。sharedclient下是一定要添加dynamic那个命令,因为是编译动态链接库,dbg表示的是debug模式。

然后问题来了!!!!!我在按照文档执行的时候发现编译到特定位置的时候回报错,说是缺少了xxx-VC120-xxx,然后就报错退出。这其实就是预编译的boost文件里面缺少了几个lib库文件,怎么办呢?自己编译!!!这也是为什么我后来又下了boost源码自己编译!!!

5、按需编译boost(如果按照官方文档第四部顺利通过,那就不需要这一步了)

第一步还是了解boost编译:/article/5109344.html,这篇博文讲的挺好的,文章底下还有几篇链接,都可以看看。

打开VS命令行,切换到boost目录,c:\boost,输入命令:

b2 stage –toolset=msvc-12.0 link=shared runtime-link=shared threading=multi address-model=64 debug release

关键的参数是link和runtime-link,都选shared,具体为什么就去看上面那篇文章吧,如果toolset选择msvc-14.0,生成的就是预编译好的boost文件里面lib64-msvc14.0里面的库文件。我一共生成了两次,分别是msvc12和msvc14,都是shared选项。自己编译的库文件都在boost\stage\lib下面,编译过程文件在bin.v2,可以直接删除。

再次打开cmd,切换到cxx-driver,输入

scons –64 –sharedclient –dynamic-windows –prefix=”c:\mongo” –cpppath=”C:\boost” –libpath=”C:\boost\stage\lib” install

然后就顺利的执行出来了,按照官方说明,迭代的执行四次不同的命令,最终会在c:\mongo文件下生成两个文件夹,分别是include和lib,lib文件里面一共应该有12个文件:



到此为止,库文件就编译成功了。

6、VS中连接mongo。先在本机搭建一个mongodb,教程参考这个就行了,很简答:http://www.cnblogs.com/lecaf/archive/2013/08/23/mongodb.html

命令行执行mongod打开mongodb,创建一个VS项目,测试代码:

#include "stdafx.h"

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

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

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;
}
return EXIT_SUCCESS;
}


项目中需要包含库目录地址,打开项目属性卡,VC++目录,包含目录添加c:\mongo\include和c:\boost_1_59_0,库目录添加c:\mongo\lib和c:\boost_1_59_0\lib64-msvc,链接器->输入->附加依赖项添加mongoclient.lib。因为我都是生成的64位的库,所以改成x64,至于选择DEBUG还是RELEASE,我选的是release,编译可以顺利通过。如果一开始生成的mongo\lib里面文件并不全,那么编译时候链接很可能就出错。

项目执行时候可能会出现错误:



其实是一系列错误,都是缺少dll,不要怕,把mongo\lib下面的mongoclient.dll复制到工程目录下对应的文件夹里面就行,至于其他的dll,在自己编译的boost\stage\lib下找,缺什么复制什么,然后再次运行程序,成功!!!

我出现问题的时候缺少的都是msvc12的dll,这些文件其实都需要msvc12的编译方法,这也是为什么还是需要自己编译一遍boost,因为预编译的boost文件里面是没有这些dll的。

运行程序成功,就会出现“connected ok”,如果数据库没打开就是报错信息。

我尝试了更改项目属性里面的配置,boost目录都改成自己编译的目录地址,即c:\boost和c:\boost\stage\lib,发现还是会报缺少dll的错误,只有拷到项目工程里才会成功。但不管怎么样,mongoclient.dll是一定要拷到工程目录里面的。

DEBUG模式下,最后还是报错,但是不是缺少dll,而是直接说



这个情况我至今还没搞明白,有大神知道为什么的话,请指点一下。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: