2012-07-08 32 views
2

我正在做一个宠物项目,并使用铿锵++(特别是MacPorts铿锵3.1)。所以我决定切换到libC++(使用std :: array等),但我使用boost(特别是asio和regex),所以我必须使用libC++重新编译boost。我删除了安装在macports中的boost,并从源代码构建boost,现在安装在/ usr/local/include和/ usr/local/lib中。从那以后,我无法编译。下面是我遇到的怪事:Clang助推怪异

当执行:

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

我得到具有与该移动构造函数(还有更多这样的错误做一个奇怪的编译错误,但你可以看到它是未来从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 

这编译(但后来链接失败)。为什么是这样?什么 - 我没有路径?必须-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 ::正则表达式,但我得到这个:

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 
+0

你使用的是哪个OSX如果Lion然后Xcode包含叮当声3.1如果不是那么/ usr/include/C++不是你想要的 – Mark 2012-07-09 15:13:37

+0

Lion有叮当声3.0,所以我使用MacPorts。我应该在我的包含路径中放入什么,以便它不使用/ usr/include/C++?注意:我使用'-I/opt/local/include',编译时从std :: regex得到奇怪的移动构造函数错误。 – DanB91 2012-07-09 16:33:55

+0

如果狮子,那么你不需要MacPort的叮当声 - 使用Xcode之一 - 然后会发生什么 – Mark 2012-07-09 16:59:06

回答

2

一个有用的,但是不能令人满意的答案:的libC++包含的std ::正则表达式,你可以用它来代替的boost ::正则表达式。

+0

你用'clang -stdlib = libC++ -std = C++ 11'来建立boost吗? – 2012-07-09 14:38:06

+1

是的,我做了:'./b2 toolset = clang cxxflags =“ - I -std = C++ 11 -stdlib = libC++”linkflags =“ - stdlib = libC++”',有和没有“-I”一个看起来怪异的移动构造函数错误,同时它正在建造)和使用-aa几次。 – DanB91 2012-07-09 15:00:00

+0

另外,我也使用std :: regex,但后来我得到一个链接错误(请参阅我编辑的帖子)。我的安装libC++会搞砸吗? MacPorts clang是否还带有libC++二进制文件(它明显与.cpp文件编译时的头文件一起提供)? – DanB91 2012-07-09 15:11:14