系統環境: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+.
另外還須要 libbson 和 MongoDB C driver預先安裝配置穩當,而MongoDB C driver又要求automake
, autoconf
and libtool,MongoDB C++ driver要求git和pkg-config
json
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; } }
使用下面的命令進行編譯:
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反饋與屢次交流後獲得
前面的文章爲第二次修改的內容,考慮到可能對其餘人有所幫助,所以未刪除,但願能有所幫助
================================注意====注意====注意====================================