• mongodb及mongoclient在win7下的编译和使用


    1、导言

    折腾mongodb几个小时最终有结果了。呃。如今就简单总结一下。

    事实上我的需求非常easy,就是在C++代码中调用mongodb的库函数。也就是要得到mongoclient.lib。本来想直接下载个,可在网上也没找到,认为又一次编译也不麻烦,于是就下了源代码编译。可下错了源代码,编了半天也编不出来,晕!

    事实上就是參考了网友们的文章,在这里下载了源代码mongodb-src-r2.6.3.zip。

    编译命令也非常easy,大家都说直接输入:scons mongoclient.lib就可以,可不断弹出这种错误:

    scons: *** Do not know how to make File target `mongoclient.lib' (C:mongo-maste
    rmongoclient.lib). Stop.

    结果不知道怎么发现mongoclient.lib在新版本号中不再是target了,已经移到了还有一个源代码mongo-cxx-driver-legacy.zip中了,地址在这里。只是,在mongo-src中,像mongo,mongod还是直接能够编译成功的。貌似不须要boost库


    2、准备工作

    2.1 下载安装mongo-win32.msi

        为了节约时间,我就直接下载了相关exe文件像mogo.exe,mogod.exe

    2.2 依次安装python,scons,boost

        具体信息可參考我给出的链接地址。我就强调一些我发现的:

        2.2.1 有人说mongoclient仅仅链接boost静态库,我发现不是这样。当指定--dynamic-windows,--sharedclient參数后。须要给出boost动态lib库文件夹,而非*-s.lib

        2.2.2 当未指定指定--dynamic-windows,--sharedclient參数时。貌似不用给出boost库文件夹,我也不太确定,反正我是没给出像libboost_date_time-vc110-mt-s-1_53.lib等文件的路径


    3、编译mongoclient

    从vs2012命令行中进入mongo-cxx-driver-legacy文件夹,运行:

    scons install-mongoclient --cpppath=boost头文件路径

    结果在buildinstalllib直接生成libmongoclient-s.lib,128M

    当然也可添入--dynamic-windows,--sharedclient,--dbg等參数。可生成相应的动态库,包含调试版和发行版。

    具体说明可看这里。结果我的文件夹里有下面文件:


    说实话。我是真没搞清楚这些文件的差别。我已经凌乱了……


    4、測试

    我不得不说。这一步也走得真悬,竟有两个重要步骤被我猜准了。。

    本来代码非常easy,就连接上mongod.exe进程开启的server即可。也不知道怎么回事。网友们都没有我说得那两个步骤。莫非是新版本号更新的问题,抑或我忽视了一些东西?

    代码例如以下:

    #include <iostream>
    #include <cstdlib>
    #include <winsock2.h>
    
    #include "mongoclientdbclient.h"
    
    using namespace std;
    
    void run()
    {
    	mongo::DBClientConnection con;
    	con.connect("127.0.0.1:27017");
    }
    
    int main()
    {
    	WSAData wsaData;
    	if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0)
    	{
    		return -1;
    	} 
    
    	try
    	{
    		run();
    		cout << "conn ok" << endl;
    	}
    	catch (const mongo::DBException &e)
    	{
    		cout << "caught " << e.what() << endl;
    	}
    	getchar();
    	return EXIT_SUCCESS;
    }
    
    在执行之前,不用说,肯定要加入boost和mongoclient的头文件和库文件。

    注意我加入的都是动态库Lib路径,应该是动态链接的,所以也须要将boost的dll路径和mongoclient-gd.dll路径加入进PATH中,且还要加入ws2_32.lib库,至于boost库和mongoclient库可直接写文件夹而不用写库名,由于有自己主动链接机制。

    以下就说我的两个重大改动。仅仅是相比于网友们的文件:

    1、在dbclient.h头文件之前加入winsock2.h。由于在vs2012中假设不加会报错:"You must include the windows and windows sockets headers before dbclient.h"


    2、在main函数开头。我加入了WSAStartup的5行代码,由于假设不加入,在某一个文件里的getAddr调用会异常:"WSAStartup() failed"


    不能说常规代码错了。仅仅能说因为各种原因,在这样的情况下须要这么做才会编译执行正常。

    执行就简单了,首先启动mogod -dbpath d:data,默认port在27017,然后启动上面的client,输出conn ok。Done !


    5、參考网址

    http://blog.csdn.net/mniwc/article/details/8590528

    http://ppgunjack.iteye.com/blog/985904

    http://database.51cto.com/art/201106/272526.htm

  • 相关阅读:
    梳理NLP预训练模型
    听懂NLPer说的是啥
    自然语言处理之HMM模型分词
    入门自然语言处理(NLP)的门
    js轮播图
    js中for循环this的使用
    vue-cli3的vue.config.js配置信息
    vuex的commit、payload、actions、setter、mutations等方法案例
    Vue做数据和视图原理(数据劫持)
    fetch的使用方法(基于promise方法进行增删改查)
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7357002.html
Copyright © 2020-2023  润新知