`
ppgunjack
  • 浏览: 81175 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用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.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的代码实现.

 

分享到:
评论
2 楼 ppgunjack 2011-11-21  
看输出似乎是没找到编译器,编译前scons的脚本会做很多预检验,包括库位置编译器,构建编译参数

VC6没试过,VS10是可以编译通过,而且vc6我不记得是否被monogodb支持,你要上它官网查

--sharedclient这个参数我感觉在VS下你是编译不出真正的链接库,因为库里面没有标明导出什么函数,可以试试linux下是否能编译出静态库
1 楼 gjc550 2011-11-21  
0
sconC:\mongodb\mongodb-1.8>scons --32 --release mongoclient.lib --sharedclient
scons: Reading SConscript files ...
scons version: 1.2.0
python version: 2 5 0 'final' 0
boost found at 'C:/boost'
Windows SDK Root 'C:/Program Files/Microsoft SDKs/Windows/v6.0a'
Checking whether the C++ compiler worksno
error: no result
c++ compiler not installed!、
这时神马情况??

大哥有空指点下

相关推荐

    MongoDB C++ Driver 3.4.x

    3. **连接MongoDB**:使用MongoDB C++ Driver,开发者可以通过创建`mongocxx::client`对象来建立与MongoDB服务器的连接。连接字符串通常包含服务器地址、端口和认证信息。 4. **数据库和集合操作**:连接建立后,...

    mongodb的c++连接接口

    5. **基本用法**:C++ 驱动通常通过创建 `MongoDB::Client` 对象来建立到 MongoDB 服务器的连接,然后使用 `MongoDB::Database` 和 `MongoDB::Collection` 对象来操作数据。例如,你可以创建一个会话,选择数据库,...

    C++ Driver for MongoDB.zip

    MongoDB C++驱动程序是连接MongoDB数据库的一种关键组件,它是用C++编写的,允许开发者使用C++语言与MongoDB进行交互。这个压缩包"MongoDB C++ Driver for MongoDB.zip"很可能包含了源代码和其他相关资源,使得开发...

    mongoDB数据库的c++接口与库文件VS2015

    总的来说,"mongoDB数据库的c++接口与库文件VS2015"主题涵盖了在C++环境中使用MongoDB的关键步骤,包括设置开发环境、建立连接、操作数据库和处理异常。通过正确配置和使用这些库文件,开发者可以轻松地在VS2015中...

    mongodb.rar

    以上就是使用MongoDB C++ API在Windows下的VS环境中进行开发的主要知识点。理解并熟练应用这些概念,你就能高效地构建与MongoDB交互的C++应用程序。在实践中不断学习和优化,将使你的代码更加健壮和高效。

    mongo_cpp_driver_win64

    MongoDB C++驱动程序是MongoDB数据库与C++应用程序之间的桥梁,它允许开发者在C++环境中无缝地操作MongoDB数据库。"mongo_cpp_driver_win64"是一个专为Windows 10设计的64位版本的MongoDB C++驱动程序。这个压缩包...

    cpp-MongoDBCDriver一个C语言的高性能MongoDB驱动程序

    这个驱动程序设计的目标是简洁、高效,并且与各种平台兼容,使得开发人员能够轻松地在C或C++项目中集成MongoDB的功能。 一、驱动程序概述 MongoDB C Driver(libmongoc)主要由两部分组成:`libmongoc`(客户端库...

    php_mongo.dll php5.3 vc6

    这个特定的版本是为PHP 5.3编译的,并且使用了Visual C++ 6 (VC6)作为编译器。在PHP环境中,扩展通常以动态链接库(DLL)的形式存在,以便在运行时加载并提供额外的功能。 MongoDB是一种流行的开源、分布式文档型...

    driver.rar

    为了在C或C++环境中与MongoDB交互,开发人员通常需要使用MongoDB提供的驱动程序。本压缩包包含两个关键的驱动:`mongo-c-driver` 和 `mongo-cxx-driver`,它们分别提供了C语言和C++语言的接口。 `mongo-c-driver` ...

    mongo.rar

    2. **连接MongoDB**:使用C++驱动,你需要创建一个`mongocxx::client`对象来连接到MongoDB服务器。这通常包括指定服务器地址(例如,"mongodb://localhost:27017")和认证信息(如果需要)。 3. **数据库操作**: ...

    mongo driver

    在使用mongo-c-driver前,你需要先将其解压并编译安装。通常,这涉及以下步骤:下载源码包,运行`configure`脚本,然后执行`make`和`make install`。确保你的系统满足所有依赖项,例如OpenSSL和 Cyrus SASL,以支持...

    qt c驱动 亲测 可用

    MongoDB-C-driver提供了丰富的API,如`mongoc_client_t`、`mongoc_collection_t`和`mongoc_cursor_t`等,方便进行这些操作。 总的来说,Qt结合MongoDB-C-driver可以为开发者提供一个强大且灵活的数据库解决方案,...

    mongo-c-driver-win32-release-staticlib

    这些头文件是编写和编译使用MongoDB C驱动程序的源代码时需要包含的。 5. **使用步骤**: - 首先,确保你的开发环境支持32位编译,并且安装了C编译器(如Visual Studio或MinGW)。 - 将“include”目录添加到你的...

    mongo-cxx-driver

    MongoDB的C++驱动,即`mongo-cxx-driver`,是一个关键组件,允许开发者使用C++语言与MongoDB数据库进行交互。MongoDB是一款流行的、基于文档的NoSQL数据库,而`mongo-cxx-driver`则是MongoDB官方支持的C++接口,它...

    mongo-c-driver-win64 DLL库

    - **连接管理**:通过`mongoc_client_t`对象建立到MongoDB服务器的连接,可以是单个服务器、副本集或分片集群。 - **集合操作**:`mongoc_collection_t`代表一个集合,提供了插入、查找、更新和删除文档的方法。 - *...

    php_mongo-1.3.0

    例如,可以使用`new MongoClient()`创建数据库连接,`$db = $client-&gt;selectDB('database_name')`来选择数据库,`$collection = $db-&gt;selectCollection('collection_name')`获取集合,然后进行插入、查询、更新和...

    LibraryManagementSystem:OOP课程

    环境与依赖Ubuntu需要安装MongoDB依赖mongo-cxx-driver()编译在根目录下执行make即可运行先启动 MongoDB。在根目录下执行./main即可架构本工程大体分为 5 部分。分别是:核心类数据库(Database):负责直接与...

    ol-games-源码.rar

    6. **客户端-服务器架构**:可能采用了客户端-服务器(Client-Server)、分布式服务器(Distributed Server)、胖客户端(Fat Client)或者P2P(Peer-to-Peer)架构。 7. **多线程与并发**:服务器端需要处理大量...

Global site tag (gtag.js) - Google Analytics