Debian/Ubuntu手动编译安装MongoDB C++11驱动及驱动测试
系统环境:
最小化、无桌面环境 新安装的Debian 8 Server 版本操作系统虚拟机一台
手动编译安装MongoDB C++驱动过程:
在官方网站的这里(https://docs.mongodb.com/ecosystem/drivers/)有各种语言相关驱动信息列表。
本文记录了C++驱动安装过程,驱动安装的大体流程参照官方github的WiKi : https://github.com/mongodb/mongo-cxx-driver/wiki/Quickstart-Guide-(New-Driver)
安装先决条件:
- Windows or any standard 'nix platform.
- A modern compiler. We require Clang 3.5+, Apple Clang 5.1+, GCC 4.8.2+, or VC2015 Update 1+.
- CMake 3.2+.
- The MongoDB C driver version 1.3.1+.
另外还需要 libbson 和 MongoDB C driver预先安装配置妥当,而MongoDB C driver又要求automake
, autoconf
and libtool,MongoDB C++ driver要求git和pkg-config
- sudo apt-get install build-essential automake autoconf libtool git pkg-config -y
安装好以上的基本组件后,还需要安装cmake,由于Debian仓库安装的cmake版本低于官方要求的3.2+,而Ubuntu仓库中的cmake版本则高于官方的要求,
Ubuntu可以直接使用apt-get安装:
- sudo apt-get install cmake -y
Debian则使用下面的源码编译安装
进入cmake官网www.cmake.org,在Download页面下载Unix/Linux Source的tar.gz文件,或者在命令行终端下载
- wget "https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz"
下载后进行解压、编译、安装
- tar -zxvf cmake-3.5..tar.gz
- cd cmake-3.5./
- ./bootstrap
- make
- sudo make install
6 cd
- 安装完毕后查看cmake版本
- cmake --version
可以看到编译安装的版本为3.5.2
接下是MongoDB C driver的安装,但MongoDB C driver依赖Libbson,所以得先安装Libbson,官方教程中安装MongoDB C driver时,如果未检测到已安装Libbson,会自动安装Libbson,教程是使用git clone源码,但是git clone下来的源码一方面包含了不稳定版本的Libbson库,另一方面该版本的Libbson存在问题,无法正常编译(Mongodb官方已核实,现已修复,不过我没有测试,但应该没有问题了)因此这里Libbson和MongoDB C driver的源码是通过github项目主页下载release版本得到,具体地址如下:
- https://github.com/mongodb/mongo-c-driver/releases
- https://github.com/mongodb/libbson/releases
这里我使用了Libbson-1.3.5,下载地址:
- https://github.com/mongodb/libbson/archive/1.3.5.tar.gz
mongo-c-driver 1.3.5版本驱动,下载地址:
- https://github.com/mongodb/mongo-c-driver/archive/1.3.5.tar.gz
在终端中下载:
- wget "https://github.com/mongodb/libbson/archive/1.3.5.tar.gz" -O libbson-1.3..tar.gz
- wget "https://github.com/mongodb/mongo-c-driver/archive/1.3.5.tar.gz" -O mongo-c-driver.tar.gz
下载完毕后,解压安装:
- tar -zxvf libbson-1.3.5.tar.gz
tar -zxvf mongo-c-driver.tar.gz
首先是libbson库的安装
- cd libbson-1.3.5/
- ./autogen.sh
make && sudo make install
然后是MongoDB C driver的安装
- cd
- cd mongo-c-driver-1.3.5/
- ./autogen.sh
make && sudo make install- cd
在以上各自 install 的过程中可以看到libbson 和 MongoDB C driver的库文件被安装在 /usr/local/lib 目录下
更新说明:
稍新版本的 MongoDB C driver在运行 autogen.sh 脚本时会报错,会提示:
"Not a release archive or a git clone"
"Please download mongoc from https://github.com/mongodb/mongo-c-driver/releases"
打开这个脚本可以看到脚本中做了一个判断,elif [ ! -f src/libbson/autogen.sh ],也即判断当前目录下src/libbson/autogen.sh文件存在不存在,不存在就报错退出。因此这里应该将libbson源码解压到MongoDB C driver路径下的src/libbson中。
接下来就是MongoDB C++ driver的安装了,回到个人家目录,官方的教程同样是使用git clone下来MongoDB C++ driver的源码进行编译安装,这里我使用和上面安装libbson 和 MongoDB C driver一样的方式来安装MongoDB C++ driver,通过github项目主页下载release版本得到,具体地址如下:
- https://github.com/mongodb/mongo-cxx-driver/releases
这里我使用了MongoDB C++ driver 3.0.1,下载地址:
- https://github.com/mongodb/mongo-cxx-driver/archive/r3.0.1.tar.gz
在终端中下载:
- wget "https://github.com/mongodb/mongo-cxx-driver/archive/r3.0.1.tar.gz" -O mongo-cxx-driver-r3.0.1.tar.gz
下载完毕后,解压安装:
- tar -zxvf mongo-cxx-driver-r3.0.1.tar.gz
- cd mongo-cxx-driver-r3.0.1/
- cd build/
- cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
注意第四步中使用选项 -DCMAKE_INSTALL_PREFIX=/usr/local 来指定将要安装C++驱动的路径
如果不指定的话,将默认安装在 mongo-cxx-driver-r3.0.1/build/install 路径下
将会导致找不到相应的头文件和库而无法编译
最后两步就是编译与安装了,使用下面的命令执行编译与安装
- sudo make
- sudo make install
注意第二步一定要使用sudo来做,因为在上面生成makefile文件时指定了安装到 /usr/local/ 这个路径下
该路径需要root权限才能写入
安装成功后,可以看到 /usr/local/lib 目录下已经成功的生成了相关的库文件,如下图所示
最后测试一下驱动,使用Mongodb官方给的测试代码,代码如下:
- #include <iostream>
- #include <bsoncxx/builder/stream/document.hpp>
- #include <bsoncxx/json.hpp>
- #include <mongocxx/client.hpp>
- #include <mongocxx/instance.hpp>
- int main(int, char**)
- {
- mongocxx::instance inst{};
- mongocxx::client conn{mongocxx::uri{}};
- bsoncxx::builder::stream::document document{};
- auto collection = conn["testdb"]["testcollection"];
- document << "hello" << "world";
- collection.insert_one(document.view());
- auto cursor = collection.find({});
- for (auto && doc : cursor)
- {
- std::cout << bsoncxx::to_json(doc) << std::endl;
- }
- }
使用下面的命令进行编译:
- c++ --std=c++ hellomongo.cpp -o hellomongo $(pkg-config --cflags --libs libmongocxx)
编译成功后,运行程序测试,成功连接数据库,如下图:
================================注意====注意====注意====================================
本文章经过前后3次大篇幅改动,最后的文章在经过向MongoDB官方Bug反馈与多次交流后得到
后面的文章为第二次修改的内容,考虑到可能对其他人有所帮助,因此未删除,希望能有所帮助
================================注意====注意====注意====================================
生成makefile的过程中,报了错误,配置过程中断,错误如下:
- CMake Error at cmake/FindLibBSON.cmake: (message):
- Don't know how to find libbson; please set LIBBSON_DIR to the prefix
- directory with which libbson was configured.
错误的提示是找不到libbson库,使用LIBBSON_DIR来指定库路径的前缀,从上面的安装过程可以看到,libbson库是安装在/usr/local/lib下面的,这里只需要指定prefix(前缀)即可,即添加 -DLIBBSON_DIR=/usr/local/ 选项,重复上面的步骤来生成makefile文件,如下图
重复上面的步骤之后,还是再次报类似的错误,libmongoc库找不到。同样的,libmongoc库从上面的安装过程可以看到,该库也是安装在/usr/local/lib下面的,添加 -DLIBMONGOC_DIR=/usr/local/ 选项来指定prefix,之后再次尝试生成makefile文件,如下所示:
- cmake .. -DLIBBSON_DIR=/usr/local -DLIBMONGOC_DIR=/usr/local
可以看到这次能够顺利生成相应的makefile所需文件了。
- 注意这是该文章第二次大幅改动时给出的临时解决办法,完全解决方法请从文章开头处查看
如果以上过程中,你的错误提示类似下面:
- -- No build type selected, default is Release
- -- Checking for module 'libbson-1.0>=1.3.4'
- --
- CMake Error at /usr/local/share/cmake-3.5/Modules/FindPkgConfig.cmake: (message):
- A required package was not found
- Call Stack (most recent call first):
- /usr/local/share/cmake-3.5/Modules/FindPkgConfig.cmake: (_pkg_check_modules_internal)
- cmake/FindLibBSON.cmake: (pkg_check_modules)
- src/bsoncxx/CMakeLists.txt: (find_package)
- -- Configuring incomplete, errors occurred!
- See also "/home/debian/mongo-cxx-driver-r3.0.1/build/CMakeFiles/CMakeOutput.log".
那么可能你的pkgconfig mongodb配置文件有问题,问题原因暂时未知,可能是个bug,已经向官方报告这个问题,解决方法是卸载pkg-config或者卸载pkgconf,然后删除build目录下面已生成的文件,重新生成。
- sudo apt-get remove --purge pkgconf -y
- rm -rf *
第二步注意要在 mongo-cxx-driver-r3.0.1/build/ 路径下做,不要误删其他文件。- cmake .. -DLIBBSON_DIR=/usr/local -DLIBMONGOC_DIR=/usr/local
最后两步就是编译与安装了,使用下面的命令执行编译与安装
- make
但是在make执行到20%的时候,再次中断了,错误如下
- [ %] Building CXX object src/mongocxx/CMakeFiles/mongocxx.dir/bulk_write.cpp.o
- In file included from /home/debian/mongo-cxx-driver-r3.0.1/src/mongocxx/private/bulk_write.hpp::,
- from /home/debian/mongo-cxx-driver-r3.0.1/src/mongocxx/bulk_write.cpp::
- /home/debian/mongo-cxx-driver-r3.0.1/src/mongocxx/private/libmongoc.hpp::: fatal error: mongoc.h: No such file or directory
- #include <mongoc.h>
- ^
- compilation terminated.
- src/mongocxx/CMakeFiles/mongocxx.dir/build.make:: recipe for target 'src/mongocxx/CMakeFiles/mongocxx.dir/bulk_write.cpp.o' failed
- make[]: *** [src/mongocxx/CMakeFiles/mongocxx.dir/bulk_write.cpp.o] Error
- CMakeFiles/Makefile2:: recipe for target 'src/mongocxx/CMakeFiles/mongocxx.dir/all' failed
- make[]: *** [src/mongocxx/CMakeFiles/mongocxx.dir/all] Error
- Makefile:: recipe for target 'all' failed
- make: *** [all] Error
从以上的输出中大致可以看到是头文件包含的错误,使用选项 VERSOBE=1 将更详细的冗长信息输出:
- make VERBOSE=
使用了 VERBOSE=1 选项后,可以看到比较详细的编译过程,从输出中可以注意到有个比较奇怪的地方,如下图所示:
上图选中的那个地方指定了一个编译器去搜索的路径,但是这个路径 /usr/local/include/libMONGOC-1.0 却是不存在的,实际的路径是小写的,如下图所示:
因此推断是路径的问题,既然没有这个目录,就手动创建这个目录,并且将小写路径下面的文件拷贝到大写路径目录下
- ls /usr/local/include/
- sudo mkdir /usr/local/include/libMONGOC-1.0/
- ls /usr/local/include/
- sudo cp /usr/local/include/libmongoc-1.0/* /usr/local/include/libMONGOC-1.0
拷贝完毕后,再次进行make编译,这次可以看到已经能够成功编译了
最终,成功编译:
最后就是安装了:
- sudo make install
注意这是该文章第二次大幅改动时给出的临时解决办法,完全解决方法请从文章开头处查看
以上驱动安装就结束了,接下来测试我们的驱动,使用官方给出的测试代码进行测试,代码如下:
- #include <iostream>
- #include <bsoncxx/builder/stream/document.hpp>
- #include <bsoncxx/json.hpp>
- #include <mongocxx/client.hpp>
- #include <mongocxx/instance.hpp>
- int main(int, char**)
- {
- mongocxx::instance inst{};
- mongocxx::client conn{mongocxx::uri{}};
- bsoncxx::builder::stream::document document{};
- auto collection = conn["testdb"]["testcollection"];
- document << "hello" << "world";
- collection.insert_one(document.view());
- auto cursor = collection.find({});
- for (auto && doc : cursor)
- {
- std::cout << bsoncxx::to_json(doc) << std::endl;
- }
- }
拷贝这段代码后进行编译,使用官方给定的命令进行编译:
- c++ --std=c++ hellomongo.cpp -o hellomongo $(pkg-config --cflags --libs libmongocxx)
但是并没有编译通过,给出了一些错误,错误如下:
- Package libmongocxx was not found in the pkg-config search path.
- Perhaps you should add the directory containing `libmongocxx.pc'
- to the PKG_CONFIG_PATH environment variable
- No package 'libmongocxx' found
- hellomongo.cpp::: fatal error: bsoncxx/builder/stream/document.hpp: No such file or directory
- #include <bsoncxx/builder/stream/document.hpp>
- ^
- compilation terminated.
之所以报这个错误,是因为mongodb c++ drvier安装路径的问题,相关头文件没有安装到编译器默认的搜索路径下,pkg-config的包含库信息的配置文件也没有被搜索到,解决办法就是将 mongo-cxx-driver-r3.0.1/build/install/ 目录下的 include 目录 和 lib 目录拷贝到 /usr/local 目录下:
- sudo cp -r ~/mongo-cxx-driver-r3.0.1/build/install/* /usr/local/
再次使用上面的编译命令,这次编译通过,试着运行一下,结果依然无法运行,提示缺少动态库,错误如下:
- error while loading shared libraries: libmongocxx.so._noabi: cannot open shared object file: No such file or directory
从错误中可以看到,缺少了 libmongocxx.so._noabi 这样一个库,后面还会不会少、少哪些库不得而知,使用命令 ldd 来看一下该程序使用了哪些库,以及缺少什么库,从下面的图中可以看到,该程序缺少2个动态库:
查找一下这2个库在哪里:
可以看到这个库我已经拷贝在程序的默认搜索路径下了,但是为什么还是提示找不到这个库呢,仔细来看一下这个库文件,发现是个链接文件,如下图:
libbsoncxx.so._noabi 库也是一样的情况,看来是符号链接的问题,重新的手动链接这个文件试试看,命令如下:
- sudo rm /usr/local/lib/lib*.so._noabi
- sudo ln -s /usr/local/lib/libmongocxx.so.3.0. /usr/local/lib/libmongocxx.so._noabi
- sudo ln -s /usr/local/lib/libbsoncxx.so.3.0. /usr/local/lib/libbsoncxx.so._noabi
注意这是该文章第二次大幅改动时给出的临时解决办法,完全解决方法请从文章开头处查看
重新链接后,重新加载一下整个库,然后再次查看 hellomongo 所需的库的情况,可以看到,此时 hellomongo 以及能够找到所需的库了,如下图:
执行 hellomongo 试试看能否正常驱动数据库,又报了一个错误,不过这个错误不是程序的问题了,从下面的错误可以看到
- terminate called after throwing an instance of 'mongocxx::v_noabi::bulk_write_exception'
- what(): No suitable servers found (`serverselectiontryonce` set): [connection timeout calling ismaster on 'localhost:27017']: generic server error
- Aborted
没有找不到servers,也就是我们还没有启动 mongodb 数据库啦,启动数据库之后,再次尝试运行 hellomongo 可以看到终于能够正常的连接了。
- 注意这是该文章第二次大幅改动时给出的临时解决办法,彻底解决方法请从文章开头处查看
关于数据库的下载安装和目录配置并没有多少复杂的问题,就略过不写了,主要是创建好默认的 /data/db 目录,并设置为当前用户可读写即可,如出现下面的问题,则是一些语言编码和环境变量的问题:
- 2016-05-22T10:18:35.788+0800 F CONTROL [main] Failed global initialization: BadValue:
Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.
比如Debian的最小化安装后 LC_ALL 的值是空的,在个人家目录下 .bashrc 文件中导入一个编码就可以了
- cd
- vi .bashrc
- #最后一行后添加
- export LC_ALL="en_US.UTF-8"
- #保存退出
- #重新读入配置
- source .bashrc
================================注意====注意====注意====================================
本文章经过前后3次大篇幅改动,最后的文章在经过向MongoDB官方Bug反馈与多次交流后得到
前面的文章为第二次修改的内容,考虑到可能对其他人有所帮助,因此未删除,希望能有所帮助
================================注意====注意====注意====================================
Debian/Ubuntu手动编译安装MongoDB C++11驱动及驱动测试的更多相关文章
- CentOS7手动编译安装内核4.11.7
1. 进入/usr/src/目录 cd /usr/src 2. 下载内核源码,网址:https://www.kernel.org wget https://cdn.kernel.org/pub/lin ...
- Ubuntu 18.04 手动编译安装 ffmpeg
ffmpeg 是一个由提供对视频.音频和其他多媒体流文件进行处理功能的库和程序构成的自由软件项目,其常被用于适用于不同格式的音频和视频的录影.转换和流处理等场合.这里记录在 Ubuntu 18.04 ...
- CentOS手动编译安装gcc
最近尝试了fedora.ubuntu.mint.debian.opensuse等多种linux发行版,与CentOS比较之后还是感觉之前用的CentOS比较熟悉,比较习惯.现在CentOS的最新版本为 ...
- LTMP手动编译安装以及全自动化部署实践(附详细代码)
大家使用LNMP架构,一般可以理解为Linux Shell为CentOS/RadHat/Fedora/Debian/Ubuntu/等平台安装LNMP(Nginx/MySQL /PHP),LNMPA(N ...
- 使用Ubuntu系统编译安装Zabbix企业级监控系统
使用Ubuntu系统编译安装Zabbix企业级监控系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Ubuntu系统部署笔记:https://www.cnblogs.com/ ...
- 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装
系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...
- Ubuntu下编译安装postgreSQL 10.5
Ubuntu下编译安装postgreSQL 10.5 ubuntu 16.04 LTS系统postgreSQL 10.5 安装包准备 1.从PostgreSQL官网下载PostgreSQL的安装包 安 ...
- 在Ubuntu下编译安装GreatSQL
在Ubuntu下编译安装GreatSQL 本次介绍如何利用Docker构建Ubuntu环境,并将GreatSQL源码编译成二进制文件. 1.准备工作 先创建本次Docker的workdir为 /dat ...
- CentOS7 编译安装 Mongodb (实测 笔记 Centos 7.0 + Mongodb 2.6.6)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...
随机推荐
- Mysql 主从复制,读写分离设置
一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...
- mysql INNODB_TRX 事务表
demo:/root# mysql -uroot -pkjk7787czcb --socket=/data01/mysql/mysql.sock -e"show processlist&qu ...
- 【HDOJ】3400 Line belt
三分. #include <cstdio> #include <cstring> #include <cmath> typedef struct { double ...
- 如何获取jqGrid中选择的行的数据
原文地址:http://hi.baidu.com/feifan3211/item/c5831f44158761a5df2a9fc1 如何获取jqGrid中选择的行的数据? 下面可以获取选择一行的id, ...
- 2013.11.7-21:15_My first Java program
- Spring 3.2 ClassMetadataReadingVisitor 错误
nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.core.type.clas ...
- 手机端H5点击类目自动定位到相应内容
_obj = {}; /*点击弹出分类*/_obj.openZZ=function(){ document.getElementById("app_screen01").style ...
- Ios17个常用代码整理
.判断邮箱格式是否正确的代码 //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @" ...
- JStorm 是一个分布式实时计算引擎
alibaba/jstorm JStorm 是一个分布式实时计算引擎. JStorm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStor ...
- C++中将string类型转换为int, float, double类型 主要通过以下几种方式:
C++中将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为 ...