2014-03-30 64 views
3

我想在我的项目中使用MongoDB C++驱动程序。我已经下载了源代码并根据附带的建议构建了这个驱动当我建立我的项目,使用此驱动程序,我收到链接错误的巨大一堆:OS X cmake链接stdlibC++,mongodb C++驱动程序问题

Undefined symbols for architecture x86_64: 
    "mongo::causedBy(std::__1::basic_string<char, std::__1::char_traits<char>, 
        std::__1::allocator<char> > const&)", referenced from: 
     mongo::DBException::addContext(std::__1::basic_string<char, 
             std::__1::char_traits<char>, 
             std::__1::allocator<char> > const&) 
                   in main.cpp.o 
    "mongo::UserException::appendPrefix(std::__1::basic_stringstream<char, 
             std::__1::char_traits<char>, 
             std::__1::allocator<char> >&) const", 
                 referenced from: 
     vtable for mongo::ConnectException in main.cpp.o 
    "std::string::copy(char*, unsigned long, unsigned long) const", referenced from: 
     mongo::(anonymous namespace)::SSLManager::password_cb(char*, int, int, void*) 
               in libmongoclient.a(ssl_manager.o) 
    "std::string::find(char const*, unsigned long, unsigned long) const", 
                   referenced from: 
    ........ 

好像有一些问题与链接C++库非标准。没有mongoDB驱动相关的代码,一切正常。什么可能是这个问题的原因,如何解决?我使用cmake,OS是OS X 10.9.2。

UPD 还链接器命令是:

"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" 
-demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -o steven 
-search_paths_first -headerpad_max_install_names CMakeFiles/steven.dir/main.cpp.o 
/usr/local/lib/libboost_thread-mt.a /usr/local/lib/libboost_filesystem-mt.a 
/usr/local/lib/libboost_system-mt.a /usr/local/lib/libboost_program_options-mt.a 
/usr/local/lib/libmongoclient.a /usr/local/opt/openssl/lib/libssl.a 
/usr/local/opt/openssl/lib/libcrypto.a -lc++ -lSystem 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a 
+0

你想要编译什么版本的驱动程序? – daveh

+0

@daveh我从https://github.com/mongodb/mongo-cxx-driver获得了实际的传统分支版本。事实上,我设法编译驱动程序本身。尝试在我的应用程序中使用驱动程序库时遇到问题。 – vard

回答

4

最后,我设法解决这个问题。原因是在编译驱动程序时使用了不同版本的stdlib,并且链接了驱动程序库的整个应用程序。我改变了驱动程序库不屑打造命令:

scons --prefix=/usr/local --ssl install-mongoclient 
     --64 --c++11 --libc++ --osx-version-min=10.7 

代替:

scons --prefix=/usr/local --ssl install-mongoclient --64 

,现在连接不产生错误和简单的教程应用程序即使mongod的运行

另一个有用的信息连接蒙戈对于那些使用mongo db C++驱动程序的项目,可以是CMakeLists.txt:

project(proj_name) 
cmake_minimum_required(VERSION 2.8) 
aux_source_directory(. SRC_LIST) 
set (CMAKE_CXX_FLAGS " -Wall -std=c++0x -stdlib=libc++ -v") 
add_executable(${PROJECT_NAME} ${SRC_LIST}) 

set(Boost_USE_STATIC_LIBS  ON) 
set(Boost_USE_MULTITHREADED  ON) 
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost COMPONENTS thread filesystem system program_options REQUIRED) 

target_link_libraries(proj_name ${Boost_LIBRARIES} /usr/local/lib/libmongoclient.a /usr/local/opt/openssl/lib/libssl.a /usr/local/opt/openssl/lib/libcrypto.a)