SIGSEGV (ошибка сегментации), когда link-thread и boost-regex через cmake

Я пытаюсь скомпилировать и запустить пример mongo-cxx-driver. Требуется связать Boost-систему, boost-thread и boost-regex. Когда я компилирую по запятой:

g++ simple_client_demo.cpp -I/home/ssi/mongo-client-install/include -L/home/ssi/mongo-client-install/lib -lmongoclient -lboost_system -lboost_thread -lboost_regex

все хорошо. Но когда я пытаюсь скомпилировать с помощью Cmake, я получаю сигнал: SIGSEGV (Segmentation fault) в /usr/include/c++/4.8/functional(2030 строка _M_manager(_M_functor, _M_functor, __destroy_functor); если это имеет значение).

Часть моего CMakeList.txt, на которую ссылается Boost:

cmake_minimum_required(VERSION 3.2)
project(test_mongo_c_driver)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

include_directories("/home/ssi/mongo-client-install/include")
link_directories("/home/ssi/mongo-client-install/lib")
#link_directories("/usr/lib/x86_64-linux-gnu/")
#add_library(mongoclient)

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED OFF)

set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost 1.54.0 REQUIRED COMPONENTS thread system regex)

if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
endif()set(SOURCE_FILES
simple_client_demo.cpp
#    tutor2.cpp
)

add_executable(test_mongo_c_driver ${SOURCE_FILES})
target_link_libraries(test_mongo_c_driver mongoclient ${Boost_LIBRARIES})

ldd a.out (составить из g++ команды):

linux-vdso.so.1 =>  (0x00007fffd41b5000)
libboost_system.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 (0x00007f236fda7000)
libboost_thread.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.54.0 (0x00007f236fb91000)
libboost_regex.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.54.0 (0x00007f236f889000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f236f585000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f236f27f000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f236f068000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f236eca3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f236ffd2000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f236ea9b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f236e87c000)
libicuuc.so.52 => /usr/lib/x86_64-linux-gnu/libicuuc.so.52 (0x00007f236e503000)
libicui18n.so.52 => /usr/lib/x86_64-linux-gnu/libicui18n.so.52 (0x00007f236e0fc000)
libicudata.so.52 => /usr/lib/x86_64-linux-gnu/libicudata.so.52 (0x00007f236c88e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f236c68a000)

ldd test_mongo_c_driver (скомпилировать из cmake):

linux-vdso.so.1 =>  (0x00007ffff7163000)
libboost_thread.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.54.0 (0x00007fc61ea28000)
libboost_system.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 (0x00007fc61e823000)
libboost_regex.so.1.54.0 => /usr/lib/x86_64-linux-gnu/libboost_regex.so.1.54.0 (0x00007fc61e51c000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc61e218000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc61df11000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc61dcfb000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc61d936000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc61ec65000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fc61d72d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc61d50f000)
libicuuc.so.52 => /usr/lib/x86_64-linux-gnu/libicuuc.so.52 (0x00007fc61d196000)
libicui18n.so.52 => /usr/lib/x86_64-linux-gnu/libicui18n.so.52 (0x00007fc61cd8e000)
libicudata.so.52 => /usr/lib/x86_64-linux-gnu/libicudata.so.52 (0x00007fc61b521000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc61b31c000)

Это мой simple_client_demo.cpp:

#include "mongo/client/dbclient.h" // the mongo c++ driver

#include <iostream>

using namespace std;
using namespace mongo;

int main(int argc, char *argv[])
{

if (argc > 2)
{
std::cout << "usage: " << argv[0] << " [MONGODB_URI]" << std::endl;
return EXIT_FAILURE;
}

mongo::client::GlobalInstance instance;
if (!instance.initialized())
{
std::cout << "failed to initialize the client driver: " << instance.status() << std::endl;
return EXIT_FAILURE;
}

std::string uri = argc == 2 ? argv[1] : "mongodb://meowtom.ru:27017";
std::string errmsg;

ConnectionString cs = ConnectionString::parse(uri, errmsg);

if (!cs.isValid())
{
std::cout << "Error parsing connection string " << uri << ": " << errmsg << std::endl;
return EXIT_FAILURE;
}

boost::scoped_ptr<DBClientBase> conn(cs.connect(errmsg));
if (!conn)
{
cout << "couldn't connect : " << errmsg << endl;
return EXIT_FAILURE;
}

try
{
unsigned long long count = conn->count("test.users");
cout << "count of exiting documents in collection test.foo : " << count << endl;

conn->remove("test.foo", BSONObj());

BSONObj o = BSON("hello" << "world");
conn->insert("test.users", o);
Query query;
BSONObj ret = conn->findOne("test.users", query);
std::cout << ret.toString() << '\n';
string e = conn->getLastError();
if (!e.empty())
{
cout << "insert #1 failed: " << e << endl;
}

// make an index with a unique key constraint
conn->createIndex("test.foo", IndexSpec().addKeys(BSON("hello" << 1)).unique());

try
{
conn->insert("test.foo", o); // will cause a dup key error on "hello" field

}
catch (const OperationException &)
{
// duplicate key error
}
//        cout << "we expect a dup key error here:" << endl;
//        cout << "  " << conn->getLastErrorDetailed().toString() << endl;
}
catch (DBException &e)
{
cout << "caught DBException " << e.toString() << endl;
return 1;
}

return 0;
}

выход для make VERBOSE=1:

/usr/local/bin/cmake -H/home/ssi/cppproj/test-mongo-c-driver -B/home/ssi/cppproj/test-mongo-c-driver --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start /home/ssi/cppproj/test-mongo-c-driver/CMakeFiles /home/ssi/cppproj/test-mongo-c-driver/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/ssi/cppproj/test-mongo-c-driver'
make -f CMakeFiles/test_mongo_c_driver.dir/build.make CMakeFiles/test_mongo_c_driver.dir/depend
make[2]: Entering directory `/home/ssi/cppproj/test-mongo-c-driver'
cd /home/ssi/cppproj/test-mongo-c-driver && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" /home/ssi/cppproj/test-mongo-c-driver /home/ssi/cppproj/test-mongo-c-driver /home/ssi/cppproj/test-mongo-c-driver /home/ssi/cppproj/test-mongo-c-driver /home/ssi/cppproj/test-mongo-c-driver/CMakeFiles/test_mongo_c_driver.dir/DependInfo.cmake --color=
make[2]: Leaving directory `/home/ssi/cppproj/test-mongo-c-driver'
make -f CMakeFiles/test_mongo_c_driver.dir/build.make CMakeFiles/test_mongo_c_driver.dir/build
make[2]: Entering directory `/home/ssi/cppproj/test-mongo-c-driver'
make[2]: Nothing to be done for `CMakeFiles/test_mongo_c_driver.dir/build'.
make[2]: Leaving directory `/home/ssi/cppproj/test-mongo-c-driver'
/usr/local/bin/cmake -E cmake_progress_report /home/ssi/cppproj/test-mongo-c-driver/CMakeFiles  1
[100%] Built target test_mongo_c_driver
make[1]: Leaving directory `/home/ssi/cppproj/test-mongo-c-driver'
/usr/local/bin/cmake -E cmake_progress_start /home/ssi/cppproj/test-mongo-c-driver/CMakeFiles 0

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]