发表于 2015-7-6 09:01:23

Visual Studio 2010 编译 MongoDB C++ Client Driver

一、编译准备

1. 安装scons
  (1) 下载python2.7, 使用x86_32位,因为scons只有32位安装包可用;
  (2) 下载scons2.3.0,The current production release of SCons is 2.3.0;
  (3)安装python 和 scons, 将C:\Python27\Scripts写入PATH;
  (4) 下载安装pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)

2. 安装boost库
  (1) 下载boost 1.49库
  (2) 编译boost 1.49 , see boost and windows, https://wiki.10gen.com/pages/viewpage.action?pageId=12157032&navigatingVersions=true

  Building Yourself


[*]Download the boost source from boost.org. Move it to C:\boost\.
[*]From the Visual Studio 2008 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 64 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=64 for 64 bit



[*]

下面是我的编译命令:
  bjam stage variant=debug--with-filesystem --with-thread --with-date_time --with-program_options --layout=versioned threading=multi toolset=msvc-10.0 --build-type=complete


[*]

编译后boost/stage/lib文件夹下生产5个dll和15个lib文件. see these links for more details:
http://www.boost.org/doc/libs/1_53_0/more/getting_started/windows.html#or-build-binaries-from-source         
https://wiki.10gen.com/pages/viewpage.action?pageId=12157032&navigatingVersions=true

3. 下载MongoDB源码
  下载Mongodb 2.4.3源码, see http://www.mongodb.org/downloads


git clone git://github.com/mongodb/mongo.git
git tag –l
git checkout r2.4.3

二、编译Mongoclient.lib

1. 准备C++编译环境
  启动cmd,到vc目录下运行vcvarsall.bat;或者开始—>程序—>\Microsoft Visual Studio 2010\Visual Studio Tools—>Visual Studio 命令提示(2010)
mongodb源码中包含了boost,js等依赖库,可以直接编译。

2.编译mongodb源文件
  编译mongoclient的命令很简单:

  scons –-dd --32 mongoclient.lib // build C++ client driver library

  Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
  编译后在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.

3.整理mongoclient依赖环境
  将mongo源码中src\mongo复制到mongodb\build\win32\32\dd作为应用程序的头文件目录,形成dd\client_build、dd\mongo.

三、mongoclient应用程序测试

1.使用vs2010搭建控制台工程
  复制src\mongo\client\examples\clientTest.cpp到工程文件夹下,添加这个cpp,形成一个完整的控制台工程。或者使用下面测试代码:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-cpp-driver/









   1:#include
   2:#include
   3:#include "mongo/client/dbclient.h"
   4:   
   5:void run()
   6:{
   7:      mongo::DBClientConnection c;
   8:      c.connect("localhost"); //your host IP address
   9:}
10:int main()
11:{
12:      try
13:      {
14:          run();
15:          std::cout msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __thiscall std::_Container_base12::_Container_base12(void)" (??0_Container_base12std   QAEXZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all_Container_base12std   QAEXXZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "protected: __thiscall std::basic_streambuf::basic_streambuf(void)" (??0?$basic_streambufDU?$char_traitsDstd    std   IAEXZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: struct std::_Iterator_base12 * * __thiscall std::_Container_base12::_Getpfirst(void)const " (?_Getpfirst_Container_base12std   QBEPAPAU_Iterator_base122XZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: void __thiscall std::basic_ios::setstate(int,bool)" (?setstate?$basic_iosDU?$char_traitsDstd    std   QAEXH_NZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __int64 __thiscall std::ios_base::width(__int64)" (?widthios_basestd   QAE_J_JZ) already defined in mongoclient.lib(log.obj)
  1>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: __int64 __thiscall std::basic_streambuf::sputn(char const *,__int64)" (?sputn?$basic_streambufDU?$char_traitsDstd    std   QAE_JPBD_JZ) already defined in mongoclient.lib(log.obj)
  ………………



[*]解决办法:http://comments.gmane.org/gmane.comp.db.mongodb.user/68910
  1)In your project settings in Visual Studio, change "Configuration Properties"\"C/C++"\"Code Generation"\"Runtime Library" to "Multi-threaded Debug (/MTd)";
  2)In your project settings in Visual Studio, change "Configuration Properties"\"Linker"\"Input"\"Additional Dependencies" to "ws2_32.lib;psapi.lib";
  3)In your project settings in Visual Studio, change "Configuration Properties"\"Linker"\"Input"\"Ignore Specific Default Libraries" to "msvcrtd";


  (3) 找不到libboost-thread-vc100-mt-sgd-1_49.lib之类问题


[*]

这个错误是由于boost库没有对应编译好的缘故,缺少什么库就重新编译相应库,boost的命名规则参考:http://www.boost.org/doc/libs/1_53_0/more/getting_started/windows.html#or-build-binaries-from-source
  (4) mongoclient.lib中无法解析的外部符号,链接错误


[*]

这个错误是由于mongoclient.lib找不到相应依赖库,在VS2010属性—>连接器—>输入中添加需要的链接库,注意mongoclient如果是debug版加入的boost依赖库亦应该是debug版。
  (5) AssertionErrortarget and source lists must have same


[*]

这个错误是由于使用scons命令编译mongo时添加了—full标识,是一个小bug,但是其实相应的编译工作已经完成,scons只是没能将编译后的lib文件复制到指定目录。
  (6) mongo源码的编译debug-32或release-32要与boost库的编译对应起来
  (7) stacktrace.obj中无法解析的变量,在工程依赖库中添加Dbghelp.lib

  1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetModuleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr

  转自:http://www.iyunv.com/geosky/archive/2013/05/05/VS2010-MongoDB-Cpp-Driver.html
页: [1]
查看完整版本: Visual Studio 2010 编译 MongoDB C++ Client Driver