Debian/Ubuntu手动编译安装MongoDB C++11驱动及驱动测试

 

 

系统环境:ios

最小化、无桌面环境 新安装的Debian 8 Server 版本操做系统虚拟机一台c++

 

手动编译安装MongoDB C++驱动过程:git

在官方网站的这里(https://docs.mongodb.com/ecosystem/drivers/)有各类语言相关驱动信息列表。github

本文记录了C++驱动安装过程,驱动安装的大致流程参照官方github的WiKi : https://github.com/mongodb/mongo-cxx-driver/wiki/Quickstart-Guide-(New-Driver)mongodb

安装先决条件:数据库

1 Windows or any standard 'nix platform.
2 A modern compiler. We require Clang 3.5+, Apple Clang 5.1+, GCC 4.8.2+, or VC2015 Update 1+.
3 CMake 3.2+.
4 The MongoDB C driver version 1.3.1+.

另外还须要 libbsonMongoDB C driver预先安装配置稳当,而MongoDB C driver又要求automake, autoconf and libtool,MongoDB C++ driver要求git和pkg-configjson

sudo apt-get install build-essential  automake autoconf libtool git pkg-config -y

 安装好以上的基本组件后,还须要安装cmake,因为Debian仓库安装的cmake版本低于官方要求的3.2+,而Ubuntu仓库中的cmake版本则高于官方的要求,bootstrap

Ubuntu能够直接使用apt-get安装:bash

sudo apt-get install cmake -y

 Debian则使用下面的源码编译安装ide

进入cmake官网www.cmake.org,在Download页面下载Unix/Linux Source的tar.gz文件,或者在命令行终端下载

wget "https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz"

下载后进行解压、编译、安装

1 tar -zxvf cmake-3.5.2.tar.gz
2 cd cmake-3.5.2/
3 ./bootstrap 
4 make
5 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版本获得,具体地址以下:

1 https://github.com/mongodb/mongo-c-driver/releases
2 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

在终端中下载: 

1 wget "https://github.com/mongodb/libbson/archive/1.3.5.tar.gz" -O libbson-1.3.5.tar.gz
2 wget "https://github.com/mongodb/mongo-c-driver/archive/1.3.5.tar.gz" -O mongo-c-driver.tar.gz

 下载完毕后,解压安装:

1 tar -zxvf libbson-1.3.5.tar.gz
2 tar -zxvf mongo-c-driver.tar.gz

首先是libbson库的安装

1 cd libbson-1.3.5/
2 ./autogen.sh
3 make && sudo make install

而后是MongoDB C driver的安装

1 cd
2 cd mongo-c-driver-1.3.5/
3 ./autogen.sh
4 make && sudo make install 5 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

下载完毕后,解压安装:

1 tar -zxvf mongo-cxx-driver-r3.0.1.tar.gz 
2 cd mongo-cxx-driver-r3.0.1/
3 cd build/
4 cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
注意第四步中使用选项 -DCMAKE_INSTALL_PREFIX=/usr/local 来指定将要安装C++驱动的路径
若是不指定的话,将默认安装在 mongo-cxx-driver-r3.0.1/build/install 路径下
将会致使找不到相应的头文件和库而没法编译

最后两步就是编译与安装了,使用下面的命令执行编译与安装

1 sudo make
2 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;
    }
}
View Code

使用下面的命令进行编译: 

c++ --std=c++11 hellomongo.cpp -o hellomongo $(pkg-config --cflags --libs libmongocxx)

 编译成功后,运行程序测试,成功链接数据库,以下图:

 

  

 

================================注意====注意====注意====================================

本文章通过先后3次大篇幅改动,最后的文章在通过向MongoDB官方Bug反馈与屡次交流后获得

后面的文章为第二次修改的内容,考虑到可能对其余人有所帮助,所以未删除,但愿能有所帮助

================================注意====注意====注意====================================

生成makefile的过程当中,报了错误,配置过程当中断,错误以下:

CMake Error at cmake/FindLibBSON.cmake:37 (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:363 (message):
  A required package was not found
Call Stack (most recent call first):
  /usr/local/share/cmake-3.5/Modules/FindPkgConfig.cmake:528 (_pkg_check_modules_internal)
  cmake/FindLibBSON.cmake:26 (pkg_check_modules)
  src/bsoncxx/CMakeLists.txt:67 (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目录下面已生成的文件,从新生成。

1 sudo apt-get remove --purge pkgconf -y
2 rm -rf *
第二步注意要在 mongo-cxx-driver-r3.0.1/build/ 路径下作,不要误删其余文件。 3 cmake .. -DLIBBSON_DIR=/usr/local -DLIBMONGOC_DIR=/usr/local

  最后两步就是编译与安装了,使用下面的命令执行编译与安装

make

 可是在make执行到20%的时候,再次中断了,错误以下

[ 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:18:0,
                 from /home/debian/mongo-cxx-driver-r3.0.1/src/mongocxx/bulk_write.cpp:19:
/home/debian/mongo-cxx-driver-r3.0.1/src/mongocxx/private/libmongoc.hpp:17:20: fatal error: mongoc.h: No such file or directory
 #include <mongoc.h>
                    ^
compilation terminated.
src/mongocxx/CMakeFiles/mongocxx.dir/build.make:62: recipe for target 'src/mongocxx/CMakeFiles/mongocxx.dir/bulk_write.cpp.o' failed
make[2]: *** [src/mongocxx/CMakeFiles/mongocxx.dir/bulk_write.cpp.o] Error 1
CMakeFiles/Makefile2:441: recipe for target 'src/mongocxx/CMakeFiles/mongocxx.dir/all' failed
make[1]: *** [src/mongocxx/CMakeFiles/mongocxx.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2

从以上的输出中大体能够看到是头文件包含的错误,使用选项 VERSOBE=1 将更详细的冗长信息输出:

make VERBOSE=1

使用了  VERBOSE=1  选项后,能够看到比较详细的编译过程,从输出中能够注意到有个比较奇怪的地方,以下图所示:

 

 上图选中的那个地方指定了一个编译器去搜索的路径,可是这个路径 /usr/local/include/libMONGOC-1.0 倒是不存在的,实际的路径是小写的,以下图所示:

 所以推断是路径的问题,既然没有这个目录,就手动建立这个目录,而且将小写路径下面的文件拷贝到大写路径目录下 

1 ls /usr/local/include/
2 sudo mkdir /usr/local/include/libMONGOC-1.0/
3 ls /usr/local/include/
4 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++11 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:3:47: 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 库也是同样的状况,看来是符号连接的问题,从新的手动连接这个文件试试看,命令以下:

1 sudo rm /usr/local/lib/lib*.so._noabi
2 sudo ln -s /usr/local/lib/libmongocxx.so.3.0.1 /usr/local/lib/libmongocxx.so._noabi
3 sudo ln -s /usr/local/lib/libbsoncxx.so.3.0.1 /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 文件中导入一个编码就能够了

1 cd
2 vi .bashrc
3 #最后一行后添加
4 export LC_ALL="en_US.UTF-8"
5 #保存退出
6 #从新读入配置
7 source .bashrc

 

================================注意====注意====注意====================================

本文章通过先后3次大篇幅改动,最后的文章在通过向MongoDB官方Bug反馈与屡次交流后获得

前面的文章为第二次修改的内容,考虑到可能对其余人有所帮助,所以未删除,但愿能有所帮助

================================注意====注意====注意====================================

相关文章
相关标签/搜索