系統環境:
最小化、無桌面環境 新安裝的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)
安裝先決條件:
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
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"
下載后進行解壓、編譯、安裝
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反饋與多次交流后得到
前面的文章為第二次修改的內容,考慮到可能對其他人有所幫助,因此未刪除,希望能有所幫助
================================注意====注意====注意====================================