Ich hab gestern auf g++ 6.1.1 aktualisiert. Seitdem linkt mein mehrere Jahre mit x verschiedenen g++ und boost-Versionen funktionierendes Programm nicht mehr. Es liegt an der regex-Bibliothek, bei der jetzt vom Linker zwei fehlende Funktionen gemeldet werden. Mein Linker-Aufruf ist wie folgt:
g++ -O2 -fPIC -Wall -pthread -L/usr/lib -L/usr/local/lib -o pdx pdx.o db.o [... .o] -lboost_regex -lboost_date_time -lboost_filesystem -lboost_program_options -lboost_system -lpthread -lssl -lcrypto -lreadline -lhistory -lcairo -letpan -lboost_thread
Die .o-Dateien stehen vor den Bibliotheken. libboost_regex ist selbstverständlich dabei. So hat es ewig funktioniert.
Nun aber kommen folgende Meldungen
pdx.o: In function `__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > boost::re_detail_106000::re_is_set_member<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> >, unsigned int>(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::re_detail_106000::re_set_long<unsigned int> const*, boost::re_detail_106000::regex_data<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, bool)':
pdx.cc:(.text._ZN5boost16re_detail_10600016re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SH_SH_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb[_ZN5boost16re_detail_10600016re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SH_SH_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb]+0x1b2): undefined reference to `boost::re_detail_106000::cpp_regex_traits_implementation<char>::transform_primary[abi:cxx11](char const*, char const*) const'
pdx.cc:(.text._ZN5boost16re_detail_10600016re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SH_SH_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb[_ZN5boost16re_detail_10600016re_is_set_memberIN9__gnu_cxx17__normal_iteratorIPKcNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEEcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEjEET_SH_SH_PKNS0_11re_set_longIT2_EERKNS0_10regex_dataIT0_T1_EEb]+0x2f9): undefined reference to `boost::re_detail_106000::cpp_regex_traits_implementation<char>::transform[abi:cxx11](char const*, char const*) const'
Zwei Methoden fehlen, cpp_regex_traits<...>::transform_primary und cpp_regex_traits<...>::transform.
Wer weiß da was drüber? Ich hab im Internet dieses Problem an Stellen gefunden, die schon fünf, sechs Jahre alt sind - warum tritt das jetzt neu auf? Und was kann man dagegen machen?
boost ist bei mir 1.60, aber schon länger.