NOSQL Mongo入門學習筆記 - C++連接Mongodb(三)


OS環境:

  Centos 7.1 release

  X86_64

編譯環境:

  G++ 4.8.3

 

已經成功搭建好了Mongodb,也初步在命令行中的查詢與寫入數據的基本方法,現在通過C++來連接Mongodb。

1.准備工作

  (1).在官網中下載mongodb的C++ driver 

    官方文檔說明:

      https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver

    值得注意的是,上方文檔說明中的git倉庫已經不可用,在github中可以搜索到,使用如下地址

      https://github.com/mongodb/mongo-cxx-driver.git

    clone下來:

      git clone https://github.com/mongodb/mongo-cxx-driver.git

  (2).安裝構建工具

    mongodb 使用scons工具來自動化構建mongodb driver for c++, 而我centos上沒有預裝這個工具,為了節省時間,我直接使用yum來安裝

      yum install scons

  (3).安裝Mongodb驅動 / mongodb-c++開發中所必需的庫。這就是復雜但是好用,龐大但是很富有精華的強大的Boost庫。

    為了節省時間,我也選用的是二進制包來安裝,需要的話也可以選擇源碼編譯。

      yum install boost-devel

    安裝完成之后,當前在我的Centos上,頭文件存在於/usr/include/boost , 動態庫文件存在與/usr/lib64/ 下.

    安裝Boost庫也是編譯C++ mongodb驅動的必要步驟.

2.開始編譯driver

  (1).編譯mongodb-cxx-driver

    在上述准備工作都已做好的時候,就可以來編譯驅動了。

    cd mongo-cxx-driver  , 直接 scons 命令,就開始自動編譯構建驅動 [ 需要更改安裝路徑的可以選擇 --prefix=$HOME/local/mongo ]選項,在編譯的時候若系統中沒有存在Boost開發庫的話,會報錯,提示需要安裝boost開發庫,若需要請先看第三步。確認無誤之后,編譯完成會構建出build目錄,目錄結構:

      |-build

      |-----install

      |----------include

      |----------lib

      |-----linux2

      |-----scons

    在這里,我們需要的是install/include 與 install/lib文件。而且lib下只有一個庫文件libmongodbclient.a

      cd build

      cp include ~/local/include

      cp lib ~/local/lib

    復制到我們常用開發的頭文件與庫文件目錄中。

    我在編譯的時候沒有遇到過報錯。這樣,驅動已成功編譯完成 

3.使用C++來連接Mongodb

    

/**
 * Mongodb connect for c++
 * author kk
 * 2015/06/17
 */

#include <iostream>
#include "mongo/client/dbclient.h"

using namespace mongo;
using namespace std;

void run(){
    DBClientConnection c;
    c.connect("localhost");
}

int main(){
    try{
        run();
        cout<<"connect ok"<<endl;
    }catch(DBException &e){
        cout<<"caught"<<e.what()<<endl;
    }
    return 0;
}

單個文件就不使用makefile了,輸入命令

   g++ main.cpp -I ~/local/include/ ~/local/lib/libmongoclient.a -lboost_thread-mt -lboost_filesystem -lboost_program_options 

在大多數教程中會提醒你這么來編譯你的源代碼,但是,這樣會報錯,詳見錯誤

  

/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)':
/usr/include/boost/regex/v4/basic_regex.hpp:382: undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::unwind_extra_block(bool)':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:1117: undefined reference to `boost::re_detail::put_mem_block(void*)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:447: undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > >(boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::error_type)':
/usr/include/boost/regex/pattern_except.hpp:75: undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:445: undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::cpp_regex_traits<char>::transform_primary(char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:923: undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::cpp_regex_traits<char>::transform(char const*, char const*) const':
/usr/include/boost/regex/v4/cpp_regex_traits.hpp:919: undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::extend_stack()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:213: undefined reference to `boost::re_detail::get_mem_block()'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `save_state_init':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:107: undefined reference to `boost::re_detail::get_mem_block()'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_imp()':
/usr/include/boost/regex/v4/perl_matcher_common.hpp:206: undefined reference to `boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `~save_state_init':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:115: undefined reference to `boost::re_detail::put_mem_block(void*)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `perl_matcher':
/usr/include/boost/regex/v4/perl_matcher.hpp:374: undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'
/home/kangkai/local/lib/libmongoclient.a(dbclient.o): In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_match()':
/usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp:973: undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > > const&)'
collect2: error: ld returned 1 exit status

 

對於向來喜歡編譯來安裝的我來說,這樣的錯誤實在郁悶了一陣。導致這樣的原因無非就是動態庫鏈接錯誤,找不到聲明與符號。根據提示,只需在編譯時加上動態庫就好了。

   g++ main.cpp -I ~/local/include/ ~/local/lib/libmongoclient.a  /usr/lib64/libboost_regex-mt.so -lboost_thread-mt -lboost_filesystem -lboost_program_options 

OK,無輸出即便就是正確。

  ./a.out

  connect ok

4.結尾

  到這里,C++連接Mongodb已經成功,只是需要Boost庫略顯龐大。


免責聲明!

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



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