MongoDB C++分段错误
MongoDB C++ Segmentation Fault
问题
我正在尝试在C++连接到MongoDB。以下代码确实可以编译。但是,当我尝试运行该程序时,出现分段错误。
-编辑-
这是我在 gdb 中运行它后得到的(源代码或制作文件没有变化):
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 使用与您正在使用的完全相同版本的提升库和标头。
- 确保它们正在查找完全相同的标头。
- 确保libmongoclient是用clang编译器编译的,boost库也是用clang one编译 的。
- 确保与正确的加速版本链接。
- 确保对所有编译使用相同的C++标志(即 C++0x) 之类的东西)
混合不同版本的boost是很常见的情况,Boost对标志和代码/编译器的变化也非常敏感。
例如,Ubuntu 12.04 附带 Boost-1.46,因此您可能会包含特定于操作系统的文件,而不是您的版本文件,链接等也是如此。此外,您可能会意外使用或链接到针对boost-1.46的编译器的OS mongo-db
如果您使用的是OS X 10.9 Mavericks,并且mongo正在使用与boost(libstdc++与libc ++)不同的C++标准库实现,则可能会发生此错误。为了防止这种情况,当您使用 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
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 为什么我的代码包含错误分段错误(核心转储)?
- 为什么会出现此错误?- 分段错误(核心转储)
- 意外的运行时错误(分段错误)
- C++将文本文件读入数组,运行错误:分段错误
- mmap 错误:分段错误/指针无效错误
- 在我的代码中找不到错误....分段错误
- 错误:分段故障(核心转储)阵列
- 用string.h将错误分段到队列中
- c++字符串流转换错误:分段错误
- 为什么我的代码显示错误分段错误(核心转储)