MongoDB cxx client driver的编译与测试(VS2010 Express)

本文记录了一些mongodb cxx driver的编译与测试过程。使用的主要编译工具为VS2010 Express,项目文件使用了源代码自带的scons和后来自建的qmake版的项目文件。均可顺利编译。scons版的mongoclient.lib在链接某些测试例子时有问题,qmake版的则没有问题。另,Ubuntu下尽管没有链接成功,由于暂时不计划使用,故没有深究。

一、下载mongodb 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编译的官方说明:+with+Visual+Studio+2010)


1)下载预编译的boost包,安装到c:/boost目录

?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客户端::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++

?pageId=21270051

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyjjxx.html