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)

安裝先決條件:

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-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;
    }
}
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反饋與多次交流后得到

前面的文章為第二次修改的內容,考慮到可能對其他人有所幫助,因此未刪除,希望能有所幫助

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM