5

問題

C++ で MongoDB に接続しようとしています。次のコードは実際にコンパイルされます。しかし、プログラムを実行しようとすると、セグメンテーション違反が発生します。

- 編集 -

これは、gdb で実行した後に得られるものです (ソース コードや makefile に変更はありません)。

GDB 実行:

Starting program: /home/nathanw/devel/Linux/mkfarina-cpp/mkfarina 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff69ae700 (LWP 13314)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff69ae700 (LWP 13314)]
0x00007ffff6d79034 in pthread_mutex_unlock () from /lib/x86_64-linux-gnu/libpthread.so.0

GDB 場所:

#0  0x00007ffff6d79034 in pthread_mutex_unlock () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x00007ffff7bca948 in boost::detail::thread_data_base::~thread_data_base() () from /usr/local/lib/libboost_thread.so.1.52.0
#2  0x000000000046c74b in boost::detail::thread_data<boost::_bi::bind_t<void, boost::_mfi::mf1<void, mongo::BackgroundJob, boost::shared_ptr<mongo::BackgroundJob::JobStatus> >, boost::_bi::list2<boost::_bi::value<mongo::BackgroundJob*>, boost::_bi::value<boost::shared_ptr<mongo::BackgroundJob::JobStatus> > > > >::~thread_data() ()
#3  0x00007ffff7bc7d39 in thread_proxy () from /usr/local/lib/libboost_thread.so.1.52.0
#4  0x00007ffff6d75e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#5  0x00007ffff6aa2cbd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#6  0x0000000000000000 in ?? ()

環境

- Ubuntu 12.04 LTS
- MongoDB 2.2.2
- MongoDB C++ Driver 2.2.2
- boost 1.52.0

ソースコード

#include <cstdlib>
#include <iostream>

// #include <cppcms/application.h>
// #include <cppcms/applications_pool.h>
// #include <cppcms/service.h>
// #include <cppcms/http_response.h>

#include "mongo/client/dbclient.h"

int main( int argc, char** argv ){
    try {
        mongo::DBClientConnection c;
        c.connect( "localhost" );

        std::cout << "connected ok" << std::endl;

    } catch( const mongo::DBException& e ){
        std::cout << "caught " << e.what() << std::endl;

    }

    return 0;

}

メイクファイル

CXX = clang++

TARGET = mkfarina

FLAGS = -c -v -00

LIBRARIES = \
    -lbooster \
    -pthread \
    -lmongoclient \
    -lcppcms \
    -lboost_thread \
    -lboost_filesystem \
    -lboost_program_options \
    -lboost_system \


INCLUDE_PATHS = \
    -I/usr/local/include \
    -I/usr/local/include/boost \
    -I/usr/local/include/mongo \
    -I/usr/local/include/cppcms \
    -I/home/nathanw/devel/_include \


LIBRARY_PATHS = \
    -L/usr/lib \
    -L/usr/local/lib \


SOURCES = \
    main.cpp \


OBJECTS = $(SOURCES:.cpp=.o)

$(TARGET): $(OBJECTS)
    $(CXX) $(OBJECTS) $(LIBRARY_PATHS) $(LIBRARIES) -o $(TARGET)

%.o: %.cpp
    $(CXX) $(FLAGS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(LIBRARIES) $< -o $@

clean:
    rm -f $(TARGET) $(OBJECTS)
4

2 に答える 2

7

上記のコードは正常に動作します...

コードとコンパイル済みの mongodb ライブラリで異なるバージョンのブーストを使用している可能性が最も高いです。

確実に:

  • Mongo DB は、使用しているブースト ライブラリとヘッダーとまったく同じバージョンを使用します。
  • それらがまったく同じヘッダーを見ていることを確認してください。
  • libmongoclient が clang コンパイラでコンパイルされ、boost ライブラリも clang コンパイラでコンパイルされていることを確認してください。
  • 正しいブースト バージョンとリンクしていることを確認してください。
  • すべてのコンパイルで同じ C++ フラグを使用していることを確認してください (つまり、C++0x など)。

異なるバージョンのブーストを混同することは非常に一般的なケースであり、ブーストはフラグとコード/コンパイラの変更に非常に敏感です。

たとえば、Ubuntu 12.04 には Boost-1.46 が付属しているため、バージョン ファイルではなく、OS 固有のファイルを含める可能性があります。これは、リンクなどと同じです。また、Boost に対するコンパイラである OS mongo-db を誤って使用またはリンクする可能性があります。 -1.46

于 2013-02-06T12:27:15.480 に答える
1

このエラーは、OS X 10.9 Mavericks を使用していて、mongo が boost とは異なる C++ 標準ライブラリの実装 (libstdc++ と libc++) を使用している場合に発生する可能性があります。これを防ぐには、scons を使用して C++ ドライバーをビルドするときに、必ず以下を渡します。

--osx-version-min=10.9

ビルド コマンドの例は次のとおりです。

scons --prefix=$HOME/mongo-client-install --extrapath=/usr/local/Cellar/boost/1.55​​.0_2 install-mongoclient --osx-version-min=10.9

于 2014-06-19T21:55:42.713 に答える