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反饋與屢次交流後獲得

前面的文章爲第二次修改的內容,考慮到可能對其餘人有所幫助,所以未刪除,但願能有所幫助

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

相關文章
相關標籤/搜索