Mongodb Compile C++ Driver
之前发现直接编译mongo源码中的驱动,静态库的驱动会很大,在链接使用的时候会报很多链接错误。
转而直接编译单独提供驱动源码,同样vc2008的版本也要做我的另一篇博文中修改,在这不多说,具体参见:
http://www.cnblogs.com/tangdoudou/p/3364015.html
1.首先说明一点,这边是编译的vc2008的版本,因为Mongo现在提供代码只有vs2010的工程,代码里面有C11的东东,故直接移植到vs2008上是不行的,如果是编译2010请跳过。
在做命令行执行任何命令之前,请执行vcvars32.bat,这个文件在你的vs2008的sdk目录下面。切忌!
2.下载2.4.6的Mongodb C++ Driver
3.按照http://www.cnblogs.com/tangdoudou/p/3364015.html中对驱动做适应性的修改,主要修改为C11和WIN32的问题。
4.编译boost(1.4.90),我编译的release版本,debug版本在链接的时候会报错:
Building Yourself Download the boost source from boost.org. Move it to C:\boost\.
From the Visual Studio IDE, choose Tools.Visual Studio Command Prompt to get a command prompt with all PATH variables set nicely for the C++ compiler.
From the MongoDB source project, run buildscripts\buildboost.bat. Or, buildboost64.bat for the bit version.
When using bjam, MongoDB expects variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model= for bit
编译报错:
libcmt.lib(invarg.obj) : error LNK2005: __initp_misc_invarg 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: __invalid_parameter 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcmt.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler 已经在 LIBCMTD.lib(invarg.obj) 中定义
>libcpmtd.lib(xdebug.obj) : warning LNK4098: 默认库“libcmt.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
这个运行CLR差别导致的错误,我暂时也没办法解决,后面如果搞定了,在补上来。有答案的兄弟,看见了也请知会一声,谢谢。
在CMD或者PowerShell中执行:
./bjam stage variant=release --with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-9.0 --build-type=complete link=static runtime-link=static
如果不出意外的话,编译后boost/stage/lib文件夹下生产5个dll和15个lib文件。
3.打开驱动根目录下面的SConstruct文件,在行尾添加:
env.Append(CPPPATH=["D:/mongodb/boost_1_49_0"], LIBPATH=["D:/mongodb/boost_1_49_0/stage/lib"])
具体路径请替换为你的路径
4.编译Mongodb Compile C++ Driver
直接敲:scons
不出意外的还是会有编译错误:(下面摘自:http://blog.csdn.net/kuaile123/article/details/9963925)

提示text.h(89):#error temp error
这是因为scons没带使用 Unicode 字符集的参数,于是就默认使用多字节字符集
我们打开\mongo-cxx-driver-v2.2\src\mongo\util下的text.h文件
/* like toWideString but UNICODE macro sensitive */
# if !defined(_UNICODE)
#error temp error
inline std::string toNativeString(const char *s) { return s; }
# else
inline std::wstring toNativeString(const char *s) { return toWideString(s); }
# endif
将#error temp error加双斜线注释掉 //#error temp error,其实这么改不是很好,看后面你就会知道。
可是输入后出错:

这些无法解析的外部符号包含在WS2_32.lib,Dbghelp.lib中,在SConstruct文件中加入
env.Append(LIBS=['WS2_32','Dbghelp'])
注:我直接SConstruct加上面这一行代码,并没有解决问题,反而在我的客户端程序中增加:
#include "mongo/client/dbclient.h"
#pragma comment(lib, "mongoclient.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "Dbghelp.lib")
倒是解决这个问题了
5.如果你也遇到“\mongo-cxx-driver-v2.4\src\mongo\util”中file.cpp文件中90行
_handle = CreateFileW(toNativeString(filename).c_str(),
报的字符编码问题,请将CreateFileW函数修改为多字节编码的函数:CreateFile,当然最好是加宏隔断控制下:
#ifdef _UNICODE //edit by tangpengchuan
_handle = CreateFileW(toNativeString(filename).c_str(), // filename
(readOnly ? : GENERIC_WRITE) | GENERIC_READ, // desired access
FILE_SHARE_WRITE | FILE_SHARE_READ, // share mode
NULL, // security
OPEN_ALWAYS, // create or open
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL); // template
else
_handle = CreateFile(toNativeString(filename).c_str(), // filename
(readOnly ? : GENERIC_WRITE) | GENERIC_READ, // desired access
FILE_SHARE_WRITE | FILE_SHARE_READ, // share mode
NULL, // security
OPEN_ALWAYS, // create or open
FILE_ATTRIBUTE_NORMAL, // file attributes
NULL); // template
#endif
// end by tangpengchuan
我个人觉得这么改很弱智,后面再改了
6.把编译好的release版本的boost和Mongodb Compile C++ Driver链接到你的Client工程里面,记得要把运行时库改为MT!
附上测试驱动Demo:
#include "mongo/client/dbclient.h"
#pragma comment(lib, "mongoclient.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "Dbghelp.lib")
using namespace mongo;
int main()
{
std::string err;
mongo::DBClientConnection conn;
if (!conn.connect(std::string("172.17.182.86:27017"),err))
{
std::cout << "cannot connect db:"<< err << std::endl;
}
else
{
std::cout << "connect db:"<< err << std::endl;
}
std::system("pause");
return ;
}
测试通过
如果你还有什么别的问题,欢迎来信交流。

本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
Mongodb Compile C++ Driver的更多相关文章
- mongodb MongoDB C#/.NET driver version
The first column lists the driver version(s). C#/.NET Driver Version MongoDB 2.6 MongoDB 3.0 MongoDB ...
- MongoDB Node.js driver
Node.js连接MongoDB的简单实例 安装Node.js driver npm install mongodb -save 连接 var MongodbClient = require('mon ...
- MongoDB C# / .NET Driver
MongoDB C# Driver是官方提供的.NET C#驱动. Getting Started with the C# Driver C# Driver Tutorial C# Driver LI ...
- MongoDB数据库CXX Driver编译
最近项目需要,想要测试下MongoDB读写大量小图片的速度(单纯文件系统io效率比较低,想试试NoSQL能不能提速), 因为使用C++开发,所以使用MongoDB的CXX驱动,需要自己编译,下面记录整 ...
- 【转】MongoDB C# / .NET Driver 中IMongoQuery的内部实现Query的用法
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似 json的bjson格式,因此可以存储比较复杂的数据类型. ...
- MongoDb C/java driver
1,在linux下安装客户端连接windows下 的MongoDBServer.
- 编译安装MongoDB C++ Driver (win8.1 vs2013)
在C++中调用mongodb的库函数需要安装mongodb的c++driver,需要自己编译,(自己搞了一天半 =_=''' ) 官网Build MongoDB From Source 说To bui ...
- MongoDB ODBC Driver for Data Integration with Power BI
This guide will walk you through connecting Microsoft Power BI to a MongoDB DataSet using our MongoD ...
- MongoDB 4.6.1 c++ driver 编译
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sheismylife/article/details/25512251 这个版本号已经和之前不一样了 ...
随机推荐
- 小强的HTML5移动开发之路(29)—— JavaScript回顾4
一.变量的作用域 javascript脚本的执行过程分为两个阶段: 第一阶段,js引擎()先扫描整个javascript代码.当碰到<script>时,会先创建一个全局的活动对象,将< ...
- UIPasteboard粘贴板:UIlabel开启复制粘贴功能(一)
首先,因为苹果只放出来了 UITextView,UITextField,webView三个控件的剪贴板,所以一般控件的剪贴板都被禁用了,因此,我们首先要做的就是把这属性放出来,其实就是实现三个简单的方 ...
- Winform 中tabcontrol 美化
需要对tabcontrol按照美工出的图进行美化 对tabpage页进行标题设置,首先对整个tabcontrol的DrawMode设置为OwnerDrawFixed,由于需要对标题宽度有要求,设置si ...
- Windows应用程序的消息处理机制
(1)操作系统接收到应用程序的窗体消息,将消息投递到该应用程序的消息队列中. (2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息. 取出消息后,应用程序能够对消息进行 ...
- Android四个基本组件(2)之Service 服务与Content Provider内容提供商
一.Service 维修: 一Service 这是一个长期的生命周期,没有真正的用户界面程序,它可以被用于开发如监视类别节目. 表中播放歌曲的媒体播放器.在一个媒体播放器的应用中.应该会有多个acti ...
- Spring Cloud和Docker搭建微服务平台
用Spring Cloud和Docker搭建微服务平台 This blog series will introduce you to some of the foundational concepts ...
- Java--Vector类
Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...
- Multi-processor having shared memory, private cache memories, and invalidate queues having valid bits and flush bits for serializing transactions
Multi-processor systems are often implemented using a common system bus as the communication mechani ...
- 简明Python3教程 9.函数
简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...
- 李开复:VC看不上你的五个原因
[编者按]:此文是李开复先生发表于其LinkedIn主页上的一篇文章,简单列举了五条与VC接触常忽略的经验.如果你是一位正准备和VC谈判取得资金上帮助的创业者,那么应该避免企业家常常犯下的五条错误. ...