本文记录了一些mongodb cxx driver的编译与测试过程。使用的主要编译工具为VS2010 Express,项目文件使用了源代码自带的scons和后来自建的qmake版的项目文件。均可顺利编译。scons版的mongoclient.lib在链接某些测试例子时有问题,qmake版的则没有问题。另,ubuntu下尽管没有链接成功,由于暂时不计划使用,故没有深究。
一、下载mongodb cxx driver源代码包编译
下载路径:http://dl.mongodb.org/dl/cxx-driver/
提示:不要管文件名中含有linux,实际上是跨平台的。
1)ubuntu10.10下编译:使用scons。编译不成功,找不到boost相关lib文件。但这些库文件的确已经安装(boost1.42.0),未做进一步处理。
2)winxp下编译:创建.pro文件,在QtCreator中使用VS2010编译不过。主要问题是assert, wassert, uassert等宏找不到。但assert在pch.h文件中有定义却提示找不到。
该问题已经解决:原因是编译选项不对,参考SConstruct文件来设置编译选项。
二、从github.com下载源代码编译:
(用VS2010编译的官方说明:http://www.mongodb.org/display/DOCS/Building+with+Visual+Studio+2010)
1)下载预编译的boost包,安装到c:/boost目录
http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032
安装到c:/boost目录。可能需要lib拷贝:C:\boost\lib\vs2010_32\*.lib -> C:\boost\lib\。使用scons时无需拷贝lib
2)下载预编译的SpiderMonkey包,安装到mongo之../js。下载路径见官方说明链接。
3)下载源代码并使用scons编译mongodb driver
C:\dev> git clone https://github.com/mongodb/mongo.git
C:\dev> cd mongo
C:\dev\mongo>git tag -l
C:\dev\mongo>git checkout r2.0.0
C:\dev\mongo>scons mongoclient.lib
最后编译成功:mongoclient.lib [158 MB (165,892,750 字节)]。
4)或者使用qmake来编译,可参考SConstruct文件来创建qmake版的项目文件.pro。
三、测试mongodb
1) 创建数据库目录:c:/data/db/
2) 启动服务mongod:exe文件可以从mongodb网站下载到。
c:/dev/tools/mongodb/bin/mongod.exe --rest
3) 测试1:打开web客户端:http://localhost:28017/
4) 测试2:使用源代码里的例子编译后进行测试。
【问题与解决】
1)编译某些例子时,提示mongo::toUtf8String找不到。具体错误为:
:-1: 错误:LNK2019: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl mongo::toUtf8String(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (?toUtf8String@mongo@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@3@@Z) referenced in function "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl mongo::errnoWithDescription(int)" (?errnoWithDescription@mongo@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)
解决:
i) 打开c:/dev/mongo/SConstruct,在575行插入下述行:
env.Append( CPPDEFINES=[ "_WIN32" ] ) # added by dou 20111015. for std::string toUtf8String(const std::wstring& wide) in util/text.cpp
然后再次编译。某试了一次,似乎不起作用。后改为自建pro文件,然后使用qmake编译。
ii) 使用qmake编译。根据SConstruct中的定义来创建。
2)qmake编译动态库版时有几个链接错误(即未加CONFIG += staticlib时)
解决:未解决,无需动态库,改为静态链接。即添加:CONFIG += staticlib
3)编译发行版时,尽管安装了预编译版的boost库,仍提示boost的lib文件找不到(与预编译的不一致):需要静态库版,却自动链接动态库版。
解决:编译选项问题,确认使用了/MT编译选项。/MD是动态链接,需去掉。
【其它参考】
SQL to Shell to C++
http://www.mongodb.org/pages/viewpage.action?pageId=21270051