2014-07-13 13 views
6

Tôi đã cài đặt tăng 1.55.0 từ homebrew trên macro mavericks. Bắt một ngoại lệ linker - không tìm std :: string :: c_str() mà tôi không hiểu tại sao. Đây có phải là một vấn đề với homebrew? Tôi đã cố gắng biên dịch tăng 1.55.0 trực tiếp từ tăng và thậm chí nó không xây dựng trên các macro.Lỗi trình liên kết - Các ký hiệu không xác định std :: string :: c_str() const trên macos với libboost_thread?

chút mã này:

#include <iostream> 
#include <unordered_map> 
#include <vector> 
#include <boost/thread/tss.hpp> 

typedef std::unordered_map<std::string, std::string> StringMap; 
static boost::thread_specific_ptr<std::vector<StringMap*>> rlist; 


int main() 
{ 
    return 0; 
} 

biên soạn với dòng lệnh này:

g++ -std=c++11 main.cpp -I/usr/local/include -L/usr/local/lib -lboost_thread -lboost_system -lboost_atomic -lboost_log -lstdc++ 

ném mối liên kết này ngoại lệ:

Undefined symbols for architecture x86_64: 
    "std::string::c_str() const", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
    "std::string::empty() const", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
    "std::allocator<char>::allocator()", referenced from: 
     boost::system::system_error::system_error(boost::system::error_code, char const*) in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::allocator<char>::~allocator()", referenced from: 
     boost::system::system_error::system_error(boost::system::error_code, char const*) in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from: 
     boost::system::system_error::system_error(boost::system::error_code, char const*) in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from: 
     boost::thread_exception::thread_exception(boost::thread_exception const&) in libboost_thread.a(thread.o) 
     boost::condition_error::condition_error(boost::condition_error const&) in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()", referenced from: 
     boost::system::system_error::system_error(boost::system::error_code, char const*) in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
     boost::system::system_error::~system_error() in libboost_thread.a(thread.o) 
     boost::system::system_error::~system_error() in libboost_thread.a(thread.o) 
     boost::thread_exception::~thread_exception() in libboost_thread.a(thread.o) 
     boost::thread_exception::~thread_exception() in libboost_thread.a(thread.o) 
     boost::thread_resource_error::~thread_resource_error() in libboost_thread.a(thread.o) 
     boost::thread_resource_error::~thread_resource_error() in libboost_thread.a(thread.o) 
     ... 
    "std::string::operator=(char const*)", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
     boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system.a(error_code.o) 
    "std::string::operator+=(char const*)", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
    "std::string::operator+=(std::string const&)", referenced from: 
     boost::system::system_error::what() const in libboost_thread.a(thread.o) 
    "std::runtime_error::runtime_error(std::string const&)", referenced from: 
     boost::system::system_error::system_error(boost::system::error_code, char const*) in libboost_thread.a(thread.o) 
    "std::_Rb_tree_decrement(std::_Rb_tree_node_base*)", referenced from: 
     std::_Rb_tree<void const*, std::pair<void const* const, boost::detail::tss_data_node>, std::_Select1st<std::pair<void const* const, boost::detail::tss_data_node> >, std::less<void const*>, std::allocator<std::pair<void const* const, boost::detail::tss_data_node> > >::_M_insert_unique(std::pair<void const* const, boost::detail::tss_data_node> const&) in libboost_thread.a(thread.o) 
    "std::_Rb_tree_increment(std::_Rb_tree_node_base*)", referenced from: 
     _tls_destructor in libboost_thread.a(thread.o) 
     std::_Rb_tree<void const*, std::pair<void const* const, boost::detail::tss_data_node>, std::_Select1st<std::pair<void const* const, boost::detail::tss_data_node> >, std::less<void const*>, std::allocator<std::pair<void const* const, boost::detail::tss_data_node> > >::erase(std::_Rb_tree_iterator<std::pair<void const* const, boost::detail::tss_data_node> >, std::_Rb_tree_iterator<std::pair<void const* const, boost::detail::tss_data_node> >) in libboost_thread.a(thread.o) 
    "std::__throw_length_error(char const*)", referenced from: 
     std::vector<std::pair<boost::condition_variable*, boost::mutex*>, std::allocator<std::pair<boost::condition_variable*, boost::mutex*> > >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::pair<boost::condition_variable*, boost::mutex*>*, std::vector<std::pair<boost::condition_variable*, boost::mutex*>, std::allocator<std::pair<boost::condition_variable*, boost::mutex*> > > >, std::pair<boost::condition_variable*, boost::mutex*> const&) in libboost_thread.a(thread.o) 
    "std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from: 
     _tls_destructor in libboost_thread.a(thread.o) 
     std::_Rb_tree<void const*, std::pair<void const* const, boost::detail::tss_data_node>, std::_Select1st<std::pair<void const* const, boost::detail::tss_data_node> >, std::less<void const*>, std::allocator<std::pair<void const* const, boost::detail::tss_data_node> > >::erase(std::_Rb_tree_iterator<std::pair<void const* const, boost::detail::tss_data_node> >, std::_Rb_tree_iterator<std::pair<void const* const, boost::detail::tss_data_node> >) in libboost_thread.a(thread.o) 
    "std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)", referenced from: 
     std::_Rb_tree<void const*, std::pair<void const* const, boost::detail::tss_data_node>, std::_Select1st<std::pair<void const* const, boost::detail::tss_data_node> >, std::less<void const*>, std::allocator<std::pair<void const* const, boost::detail::tss_data_node> > >::_M_insert_unique(std::pair<void const* const, boost::detail::tss_data_node> const&) in libboost_thread.a(thread.o) 
l 
+0

gì 'g ++ -v' cung cấp cho bạn? –

Trả lời

16

sức mạnh tâm linh của tôi nói:

  • g++ trên hệ thống của bạn thực sự là clang, được định cấu hình để sử dụng libc++ theo mặc định. Đây là cấu hình thông thường trên máy Mac.
  • Phân phối tăng homebrew được biên dịch với libstdc++ và có thể là g ++ thực.

Hai thư viện chuẩn không tương thích nhị phân, do đó lỗi liên kết. Để khắc phục điều này, hãy vượt qua -stdlib=libstdc++ để mặc quần áo của bạn, hoặc lấy GCC thực (Homebrew phải có bản phân phối) hoặc build boost with libc++.

Repro & demo:

$ cat 1.cpp 
#include <string> 
#include <iostream> 
int main() { 
    std::string s("Blah"); 
    std::cout << s << std::endl; 
} 

$ g++ -v 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.2.0 
Thread model: posix 
$ g++ 1.cpp -c -stdlib=libstdc++ -o 1.o 
$ g++ 1.o -lstdc++ 
Undefined symbols for architecture x86_64: 
    "std::allocator<char>::allocator()", referenced from: 
     _main in 1.o 
    "std::allocator<char>::~allocator()", referenced from: 
     _main in 1.o 
    "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: 
     _main in 1.o 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from: 
     _main in 1.o 
    "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from: 
     _main in 1.o 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in 1.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in 1.o 
    "std::cout", referenced from: 
     _main in 1.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in 1.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<<<char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from: 
     _main in 1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

$ g++ -stdlib=libstdc++ 1.o && ./a.out 
Blah 
+0

bingo. Điều đó là vậy đó. Cảm ơn bạn. – marathon

Các vấn đề liên quan