2

私はペットプロジェクトを行っており、clang ++ (具体的には MacPorts clang 3.1) を使用しています。そのため、libc++ (std::array などを使用するため) に切り替えることにしましたが、ブースト (特に asio と正規表現) を使用していたため、libc++ を使用してブーストを再コンパイルする必要がありました。macports にインストールされていた boost を削除し、ソースから boost をビルドし、現在は /usr/local/include および /usr/local/lib にインストールされています。それ以来、私はコンパイルできません。私が遭遇している奇妙な点は次のとおりです。

実行時:

clang++ -g  -std=c++11 -stdlib=libc++ -c main.cpp

move コンストラクターに関係する奇妙なコンパイル エラーが発生します (このエラーには他にもありますが、ご覧のとおり、boost から発生しています)。

/usr/include/c++/v1/string:1952:10: error: overload resolution selected implicitly-deleted copy assignment operator
__r_ = _STD::move(__str.__r_);
     ^
/usr/include/c++/v1/string:1942:9: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
    __move_assign(__str, true_type());
    ^
/usr/include/c++/v1/string:1961:5: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__move_assign' requested here
__move_assign(__str, integral_constant<bool,
^
/usr/local/include/boost/regex/v4/perl_matcher.hpp:207:16: note: in instantiation of member function 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=' requested here
        s1 = traits_inst.transform(a, a + 1);

ただし、実行すると(「-I」に注意してください。正確な位置にある必要があります):

clang++ -I -std=c++11 -stdlib=libc++ -g -c main.cpp

これはコンパイルされます (ただし、リンクは後で失敗します)。どうしてこれなの?-I はパスなしで何をしますか? -stdlib= の前に -I を付ける必要がありますか?

楽しい部分:

すべてがコンパイルされるようになりましたが、リンクしません。実行時:

clang++ main.o FTPClient.o FTPConnection.o -lboost_system -lboost_regex -std=c++11 -stdlib=libc++  -g  -o cli

メッセージが表示されます:

Undefined symbols for architecture x86_64:
"__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_", referenced from:
  boost::re_detail::cpp_regex_traits_implementation<char>::lookup_collatename(char const*, char const*) const in libboost_regex.a(instances.o)
  boost::re_detail::cpp_regex_traits_implementation<char>::lookup_classname_imp(char const*, char const*) const in libboost_regex.a(instances.o)
  boost::re_detail::basic_regex_parser<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::fail(boost::regex_constants::error_type, long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, long) in libboost_regex.a(instances.o)
  boost::re_detail::cpp_regex_traits_implementation<char>::lookup_classname(char const*, char const*) const in libboost_regex.a(instances.o)
  ld: symbol(s) not found for architecture x86_64

今、私はいくつかの -lboost フラグが欠けているのではないかと考えていますが、それが何であるかはわかりません。この理由は何でしょうか?

どうもありがとう!

編集:ブーストのインストールのログを調べたところ、次のことに気付きました:

..failed clang-darwin.link.dll /usr/local/lib/libboost_filesystem.dylib...
clang-darwin.link.dll /usr/local/lib/libboost_regex.dylib
Undefined symbols for architecture x86_64:
  "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_", referenced from:
  boost::c_regex_traits<char>::transform(char const*, char const*) in c_regex_traits.o
  boost::c_regex_traits<char>::lookup_classname(char const*, char const*) in c_regex_traits.o
  boost::c_regex_traits<char>::lookup_collatename(char const*, char const*) in c_regex_traits.o
  boost::re_detail::RegExData::update() in cregex.o
  boost::RegEx::What(int) const in cregex.o
  boost::re_detail::pred2::operator()(boost::match_results<char const*, std::__1::allocator<boost::sub_match<char const*> > > const&) in cregex.o
  boost::re_detail::cpp_regex_traits_implementation<char>::lookup_collatename(char const*, char const*) const in instances.o
  ...
  "__ZNSt3__112basic_stringIwNS_11char_traitsIwEENS_9allocatorIwEEE6__initIPKwEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_", referenced from:
  boost::c_regex_traits<wchar_t>::transform(wchar_t const*, wchar_t const*) in wc_regex_traits.o


  boost::c_regex_traits<wchar_t>::lookup_classname(wchar_t const*, wchar_t const*) in wc_regex_traits.o
  boost::re_detail::cpp_regex_traits_implementation<wchar_t>::lookup_collatename(wchar_t const*, wchar_t const*) const in winstances.o
  boost::re_detail::cpp_regex_traits_implementation<wchar_t>::lookup_classname_imp(wchar_t const*, wchar_t const*) const in winstances.o
  boost::re_detail::cpp_regex_traits_implementation<wchar_t>::lookup_classname(wchar_t const*, wchar_t const*) const in winstances.o
ld: symbol(s) not found for architecture x86_64  
clang: error: linker command failed with exit code 1 (use -v to see invocation)

これは、ブースト正規表現が -libc++ と互換性がない可能性があることを意味しますか?

編集 2: std::regex を使用してみましたが、次のようになります:

Undefined symbols for architecture x86_64:
   "__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA_", referenced from:
  std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > std::__1::regex_traits<char>::__lookup_collatename<char const*>(char const*, char const*, char) const in main.o
  unsigned int std::__1::regex_traits<char>::__lookup_classname<char const*>(char const*, char const*, bool, char) const in main.o
 ld: symbol(s) not found for architecture x86_64
4

1 に答える 1

2

役に立ちますが、不十分な答え: libc++ には、boost::regex の代わりに使用できる std::regex が含まれています。

于 2012-07-09T14:36:22.780 に答える