MongoDB C++;分段故障 问题 我试图连接C++中的MangGDB。下面的代码实际上是编译的。然而,当我试图运行程序时,我得到了一个分段错误 -编辑-

MongoDB C++;分段故障 问题 我试图连接C++中的MangGDB。下面的代码实际上是编译的。然而,当我试图运行程序时,我得到了一个分段错误 -编辑-,c++,mongodb,segmentation-fault,C++,Mongodb,Segmentation Fault,这是我在gdb中运行它后得到的结果(源代码或makefile没有更改): GDB运行: GDB,其中: 源代码 #包括 #包括 //#包括 //#包括 //#包括 //#包括 #包括“mongo/client/dbclient.h” int main(int argc,字符**argv){ 试一试{ mongo::DBClientConnection c; c、 连接(“本地主机”); std::cout上述代码运行良好 很可能您在代码和编译的mongodb库中使用了不同版本的boost 确保:

这是我在gdb中运行它后得到的结果(源代码或makefile没有更改):

GDB运行: GDB,其中: 源代码
#包括
#包括
//#包括
//#包括
//#包括
//#包括
#包括“mongo/client/dbclient.h”
int main(int argc,字符**argv){
试一试{
mongo::DBClientConnection c;
c、 连接(“本地主机”);

std::cout上述代码运行良好

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

确保:

  • Mongo DB使用与您使用的boost库和头文件完全相同的版本
  • 确保他们查看的标题完全相同
  • 确保libmongoclient是用clangcompiler编译的,boost库也是用clangone编译的
  • 确保链接到正确的boost版本
  • 确保所有编译都使用相同的C++标志(例如C++ + x)
很常见的情况是混合使用不同版本的boost,而且boost对标志和代码/编译器的更改非常敏感


例如,Ubuntu12.04附带Boost-1.46,因此您可能会包含操作系统特定的文件,而不是版本文件,链接等也是如此。此外,您可能会意外使用或链接到针对Boost-1.46编译的OS mongo db,如果您使用的是OS X 10.9 Mavericks,而mongo使用的是不同的implC++标准库的执行比Boost(LIbSTDC++VS+LBC++)的要高,为了防止这种情况,当您用SCONS构建C++驱动程序时,必须通过:

--osx版本最小值=10.9

示例生成命令可能是:


scons--prefix=$HOME/mongo client install--extrapath=/usr/local/cillar/boost/1.55.0_2 install mongoclient--osx version min=10.9

您试过缩小范围吗?我的意思是:使用调试符号编译(如果可能,也使用带有调试符号的mongo lib)并在调试器中运行,或在预加载libSegFault的情况下运行。如果这还不够,请使用最小且更常见的配置(g++而不是clang,请删除不需要的lib和inc路径)老实说,这只是我第二个C++项目,不使用XCODE。所以,我不熟悉如何在命令行上进行调试……@ NahanWHER你可以包括更多关于崩溃的细节(堆栈跟踪等)。。至于命令行调试,请尝试在此处运行
gdb您的程序
,这将使您进入gdb。然后,键入
run
。当您的程序崩溃时,键入
where
,这将给您一个回溯。@NathanWehr上面的一个附录:在您的标志中添加
-g
,以便发出铿锵的emts调试信息。@acm,gdbs建议它与线程库有关。出于某种原因,我认为这不是问题所在。在编译时,我不得不将boost文件系统的mongo驱动程序中定义的符号从2更改为3(不会使用2编译,文档中说他们使用3)这是一个很好的建议。我同意代码看起来不错。请浏览上面的检查表,看看它是否有帮助。你说得对。我必须下载/安装旧版本的Boost和Mango C++驱动程序。不同的编译器工作得很好。
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
#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)