c++ - MongoDB C++ 段错误

标签 c++ mongodb segmentation-fault

问题

我正在尝试使用 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)

最佳答案

上面的代码工作正常...

很可能您在代码和编译的 mongodb 库中使用了不同版本的 boost。

确保:

  • Mongo DB 使用完全与您正在使用的相同版本的 boost 库和 header 。
  • 确保他们查看的是完全相同的标题。
  • 确保 libmongoclient 是用 clang 编译器编译的,boost 库也是用 clang 编译器编译的
  • 确保链接到正确的提升版本。
  • 确保对所有编译使用相同的 C++ 标志(即 C++0x 之类的东西)

混合使用不同版本的 boost 是很常见的情况,而且 Boost 对标志和代码/编译器的变化非常敏感。

例如 Ubuntu 12.04 附带 Boost-1.46,因此您可能包含操作系统特定文件而不是您的版本文件,链接等也是如此。您也可能不小心使用或链接操作系统 mongo-db 是针对 boost-1.46 的编译器

关于c++ - MongoDB C++ 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635506/

相关文章:

javascript - Mongoose - 设置关系在计划中失败

java - 自动过期文档上的触发事件 - Mongo DB

mongodb - 启动 mongod fork,ERROR : child process failed, exited with error number 1

c++ - 出错时cin做什么

c++ - TCHAR 与 LPSTR 不兼容

c++ - C++ 中的静态变量

C++20 概念和模板 : fixe-size and resizable array

c++私有(private)属性可以在构造函数中使用,但在其他方法中会出现段错误

c - Segmentation Fault C语言读一个简单的词

C++ - std::map.insert() 段错误