本来尝试mingw编译MongoDB,发觉要解决编译错误需要改很多东西。MongoDB在window下的宏分支默认都是使用微软库,导致mingw频频报错。
一路解决编译错误,一直改到message.cpp,其中的调用
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &one, sizeof(one));
IPV6_V6ONLY定义在mingw对应的库中找不到,也不懂这里的逻辑,放弃修改。
安装vs2010来整,以后有时间再研究mingw下编译的可能性。
1.编译boost
编译boost库,可下载最新boost1.46.1,下载解压至本地路径
(1)生成bjam:
cd E:\workspace\c++\boost_1_46_1\tools\build\v2\engine\src
build
window下会自动调用cl编译
如果希望mingw编译,执行
build gcc
bjam使用gcc或者vc编译都没关系,这只是一个调用编译器的shell解释工具。
(2)编译需要的boost库
拷贝bjam.exe到boost文件夹根目录,执行
E:\workspace\c++\boost_1_46_1>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=64
此处为MongoDB文档中对于编译boost库的要求原文:
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=64 for 64 bit
link=static runtime-link=static,boost需要编译成静态库,因为mongodb只会去链接boost的静态库
address-model=64在win7 64环境下此项必须,不加在编译mongodb的c++ client时会出现链接错误。
2.编译Spider Monkey
Spider Monkey是作为MongoDB的js引擎,印象里面应该为1.7.0的版本。目前MongoDB也正在考虑加入Chrome使用的v8作为js引擎,在编译项目的scon脚本中也为其预留了配置参数。
建议直接下载MongoDB网站提供的vs2010的预编译版本js库,跳到步骤3,不怕麻烦可以继续。
编译js库的命令如下:
export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"
make -f Makefile.ref
参数设置CFLAGS="-DJS_C_STRINGS_ARE_UTF8"是必要的,参考mongodb原文解释:
SpiderMonkey does not use UTF-8 by default, so we enable before building.
如果是win7会报缺少WINNT6.1.mk的问题,直接复制\js\src\config下的WINNT6.0.mk,重命名成WINNT6.1.mk。
vs2010编译js1.7.0和js1.8.0没问题,但是对于最新的js1.8.5,vs2010直接编译会有问题,这是针对FireFox4的js版本,加入了很多新特性,api有很多修改增减,最好不要折腾用。
更具体的编译步骤和注意事项可以直接参考Spider Monkey官网说明,
https://developer.mozilla.org/En/SpiderMonkey/Build_Documentation#Building_SpiderMonkey_1.8_or_earlier
3.编译MongoDB的c++ client
编译前注意几点:
(1).如果是64位Window系统,必须加--64参数。
MongoDB采取内存文件映射方式管理数据,所以如果是32位系统,则数据文件会被限制在2G
(2).SpiderMonkey文件夹必须放在MongoDB目录同级,该文件夹内应该包括编译好的库文件和包含js头文件的文件夹,可以直接下载MongoDB官网提供的编译好的js库文件,其放置目录如下:
D:\mongodb>tree /f
D:.
\
├─js <----SpiderMonkey的库文件放此文件夹下
│ │ js.lib
│ │ js32d.lib
│ │ js32r.lib
│ │ js64d.lib
│ │ js64r.lib
│ │ README
│ │ README_vs2010_prebuilt_spidermonkey.txt
│ │
│ └─src <----SpiderMonkey的头文件放在此文件夹内
│ jsapi.h .....
└─mongodb-mongo-b7f7139 <----MongoDB的编译脚本和源代码都解压在这个目录,目录名随意,只注意保持和js的相对位置就可以
(3).需要指定Boost库的位置,有两种方式可以选择:
((1))修改MongoDB目录下的SConstruct文件,将
boostDir=find_boost()替换成boostDir="E:/workspace/c++/boost_1_46_1" <----此处为你实际boost目录,注意反斜线
前面编译的boost库应该放入boost目录的Lib目录下,如下
E:\workspace\c++\boost_1_46_1\Lib 的目录
2011/04/01 23:49 <DIR> .
2011/04/01 23:49 <DIR> ..
2011/04/01 20:20 946,598 libboost_date_time-vc100-mt-s-1_46_1.lib
2011/04/01 20:20 946,598 libboost_date_time-vc100-mt-s.lib
2011/04/01 20:21 2,415,136 libboost_filesystem-vc100-mt-s-1_46_1.lib
2011/04/01 20:21 2,415,136 libboost_filesystem-vc100-mt-s.lib
2011/04/01 20:21 7,024,072 libboost_program_options-vc100-mt-s-1_46_1.lib
2011/04/01 20:21 7,024,072 libboost_program_options-vc100-mt-s.lib
2011/04/01 20:20 129,588 libboost_system-vc100-mt-s-1_46_1.lib
2011/04/01 20:20 129,588 libboost_system-vc100-mt-s.lib
2011/04/01 20:21 653,644 libboost_thread-vc100-mt-s-1_46_1.lib
2011/04/01 20:21 653,644 libboost_thread-vc100-mt-s.lib
10 个文件 22,338,076 字节
2 个目录 106,010,157,056 可用字节
((2))将boost文件夹路径置为C:/boost,这个路径为编译MongoDB默认搜索boost的路径。
当js和和boos都准备好后,可以尝试运行命令
D:\mongodb\mongodb-mongo-b7f7139>scons --64 --help <---64位操作系统需要加参数--64
如果文件都被正确放置在可以被安装脚本找到的位置,则可以成功显示help提示,否则会有对应的出错提示,这时你需要确认boost的路径是否在SConstruct中被设置好,或者js的库和头文件是否放在上面说明中指定的位置。
如果能成功,则应该能开始编译c++客户端了,执行
D:\mongodb\mongodb-mongo-b7f7139>scons --64 --release mongoclient.lib --sharedclient
完成编译。
不加--sharedclient默认编译出来是180多m的静态库。
--sharedclient 根据文档编译出来的客户端为动态库,但是我使用vs2010编译出的mongoclient.lib 和mongoclient.dll发现不能使用,利用dumpbin查看其导出函数,发现里面全为pcre库中的函数,正在研究这个问题,发现scon的脚本目前还有一些问题,比如即使你使用--sharedclient 参数静态库也一定会被生成,随后被同名动态库覆盖,而且window下生成的这个动态库实际根本不可用。
目前来看dll中只有pcre的函数因为mongoclient本身没有任何方法被标识导出,也没有使用过.def导出定义文件,因此vs编译客户端没有导出任何mongodb的方法,并且由于没有剔除pcre的代码,导致导出dll中都是pcre的函数。
dbclient.h中的大量接口使用参数为string,在没有包装情况下不适合直接编译为动态库
静态库release和debug版本都可用,但根据scon脚本的编译参数,使用release的代码需要在代码生成当中设置MT编译,而debug的使用MDd编译
如果使用最新的boost 1.46.1,会出现编译错误,util/text.cpp对boost::system::system_error的调用是基于官网推荐的boost1.42的实现,与boost1.46.1不一致,可以直接注释,或者修改MongoDB的代码实现.
分享到:
相关推荐
1.编译环境 ...(1)下载vs2010 (2) 下载python2.7 https://www.python.org/downloads/ python-2.7.11.msi 下载scons2.4.1,The current production release of SCons is 2.3.0; http://www.scons.org/doc/ ...
MongoDB C++驱动编译教程,采用scons完成MongoDB C++驱动的编译,包括 boost库下载地址,MongoDB C++t驱动下载地址,包括Python 2.7.16版本 32位 X86安装包,以及驱动编译的具体教程,及编译过程中的几个示例。...
非常详细的WINDOWS下编译MONGODB C/C++驱动的文档,包含MONGODB数据库安装,CMAKE安装,PERL安装,BOOST库编译,OPENSSL库编译(ssleay32.dll、libeay32.dll),MONGODB C驱动(libbson-1.0.dll、libmongoc-1.0.dll...
本资源使用vs2017编译的mongodb-cxx-driver-r3.6.2,里面包括相关源码,以及使用cmake编译的工程,同时写了一个测试工程,能够对mongodb数据库进行简单的操作。
MongoDB VS2015 windows10下的C++开发环境搭建
windows 下 MongoDB C++ 64位驱动,debug库文件,目前最新MongoDB C++ Driver 3.4.x版。
mongodb2.6.12 windows编译32/64位开发库.
使用VS2017编译Mongodb数据库C++driver,编译结果在install文件夹中,另外还有写的word文档详细说明安装及编译过程,最后附加一个使用案例。
在win32系统下搭建MongoDb C++驱动 编译成dll文件
MongoDB C/C++开发使用案例Demo(含源代码例子、编译好的MongoDB C库文件(.h .lib .dll)、开发环境搭建配置文档等),可直接用于项目开发
MongoDB C++ Driver 3.4.x 版,是目前最新版本。需要和MongoDBC驱动一起使用。
VS2010C++下编译调试MongoDB源码.pdf
安装:mongod --dbpath=D:\mongodb\db --logpath=D:\mongodb\log\mongo.log= --install 卸载:mongod.exe --remove 最近准备把空闲时间都发在mongodb的研究上,因此将有一系列的文章记录这个过程。 直接从官网...
里面包含了c+调用mongodb接口的所用到的lib,dll,include库等以及对应的boost文件,可以在vs2015上使用,亲测过
win10 vs2015update3 boost1.68环境下编译的mongo-cxx-driver-r3.5.1、mongo-c-driver1.16.2版本,里面直接包括mongo-cxx-driver-r3.5.1(头文件、lib(32\64))
MongoDB针对C++驱动的安装
MongoDB Client 客户端工具
1. 设计并开发高效的C++对象池算法,时间复杂度为 O(1) 在整个重构框架中,对象池是负责管理内存的底层基本模块 2. 利用命令模式的思想开发 Redis 子模块 抽象出方便高效的接口提供给上层程序员使用 3. 利用组合...
Mongodb的c++开发环境部署vs2015,需要的所有相应的资源文件。 Libbson1.9.2 Mongo-c-driver-1.9.2 Mongo-cxx-drive-releases-v3.2 mongodb-win32-x86_64-2008plus-ssl-3.4.23-signed.msi
win7环境下,使用vs2017编译的MongoDB-c-driver 和MongoDB-cxx-driver。 下载之后可以直接放入C++工程中使用。 版本信息: mongo-c-driver-1.13.0, mongo-cxx-driver-r3.4.0