日期:2014-05-16  浏览次数:20560 次

使用VS2010编译MongoDB的c++ client

本来尝试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.l