From: Daniel J. <dan...@gm...> - 2014-12-24 12:50:24
|
> On Dec 24, 2014, at 1:52 AM, Jesse Alama <jes...@fa...> wrote: > > I'm working on updating a package of mine (ledger) that uses the boost C++ suite (I'm using boost1.53.python27) as well as libicu48. I'm having some trouble with the build and can't quite tell where the problem lies. Consider this minature C++ program badboost.cpp (which occurs as one of the programs during the config stage of ledger): > > #include <boost/regex/icu.hpp> > > using namespace boost; > > int main() { > std::string text = "Активы"; > u32regex r = make_u32regex("активы", regex::perl | regex::icase); > return u32regex_search(text, r) ? 0 : 1; > } > > When compiling this, I get a linking error: > > In file included from badboost.cpp:1: > In file included from /sw/include/boost/regex/icu.hpp:25: > In file included from /sw/include/boost/regex.hpp:31: > In file included from /sw/include/boost/regex/v4/regex.hpp:32: > In file included from /sw/include/boost/regex/v4/regex_workaround.hpp:43: > In file included from /sw/include/boost/shared_ptr.hpp:17: > /sw/include/boost/smart_ptr/shared_ptr.hpp:491:41: warning: rvalue references are a C++11 extension [-Wc++11-extensions] > shared_ptr( std::unique_ptr< Y, D > && r ): px( r.get() ), pn() > ^ > /sw/include/boost/smart_ptr/shared_ptr.hpp:556:51: warning: rvalue references are a C++11 extension [-Wc++11-extensions] > shared_ptr & operator=( std::unique_ptr<Y, D> && r ) > ^ > /sw/include/boost/smart_ptr/shared_ptr.hpp:558:55: warning: rvalue references are a C++11 extension [-Wc++11-extensions] > this_type( static_cast< std::unique_ptr<Y, D> && >( r ) ).swap(*this); > ^ > 3 warnings generated. > Undefined symbols for architecture x86_64: > "boost::basic_regex<int, boost::icu_regex_traits>::do_assign(int const*, int const*, unsigned int)", referenced from: > boost::basic_regex<int, boost::icu_regex_traits>::assign(int const*, int const*, unsigned int) in badboost-2044fe.o > "boost::re_detail::get_mem_block()", referenced from: > boost::re_detail::save_state_init::save_state_init(boost::re_detail::saved_state**, boost::re_detail::saved_state**) in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::extend_stack() in badboost-2044fe.o > "boost::re_detail::put_mem_block(void*)", referenced from: > boost::re_detail::save_state_init::~save_state_init() in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::unwind_extra_block(bool) in badboost-2044fe.o > "boost::re_detail::verify_options(unsigned int, boost::regex_constants::_match_flags)", referenced from: > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::find_imp() in badboost-2044fe.o > "boost::re_detail::raise_runtime_error(std::runtime_error const&)", referenced from: > void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::icu_regex_traits> >(boost::regex_traits_wrapper<boost::icu_regex_traits> const&, boost::regex_constants::error_type) in badboost-2044fe.o > "boost::re_detail::get_default_error_string(boost::regex_constants::error_type)", referenced from: > boost::icu_regex_traits::error_string(boost::regex_constants::error_type) const in badboost-2044fe.o > "boost::re_detail::is_combining_implementation(unsigned short)", referenced from: > bool boost::re_detail::is_combining<int>(int) in badboost-2044fe.o > "boost::icu_regex_traits::isctype(int, unsigned long long) const", referenced from: > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::find_restart_word() in badboost-2044fe.o > boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> boost::re_detail::re_is_set_member<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, int, boost::icu_regex_traits, unsigned long long>(boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, boost::re_detail::re_set_long<unsigned long long> const*, boost::re_detail::regex_data<int, boost::icu_regex_traits> const&, bool) in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::match_word_boundary() in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::match_within_word() in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::match_word_start() in badboost-2044fe.o > boost::re_detail::perl_matcher<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int>, std::__1::allocator<boost::sub_match<boost::u8_to_u32_iterator<std::__1::__wrap_iter<char const*>, int> > >, boost::icu_regex_traits>::match_word_end() in badboost-2044fe.o > "boost::re_detail::icu_regex_traits_implementation::do_transform(int const*, int const*, icu_48::Collator const*) const", referenced from: > boost::re_detail::icu_regex_traits_implementation::transform_primary(int const*, int const*) const in badboost-2044fe.o > boost::re_detail::icu_regex_traits_implementation::transform(int const*, int const*) const in badboost-2044fe.o > ld: symbol(s) not found for architecture x86_64 > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > Is there some kind of binary incompatibility problem here? > > Jesse While most of boost is just header files, there are some actual libraries that are needed for some things and regex is one of them. Try adding -lboost_regex-mt to the link command. Daniel |