简体   繁体   中英

Boost regex: Undefined references when linking

Until some weeks ago, using the boost_regex library I used to compile a C++ file test.cpp using the following command.

g++-4.9 -Wall -O3 -march=native -flto -DNDEBUG -o test \
 --std=c++14 test.cpp -lboost_regex -pthread

The compilation was working perfectly . But at some point, I needed to upgrade my OS (more precisely, it was Ubuntu 14.04, now it is Ubuntu 16.04).

I kept my local folders with my data, and I also installed the Boost library again in the new system, including boost_regex.

The Boost version in the new system is 1.58, unfortunately I cannot know which Boost version I was using before because it is now deleted.

I try to compile again the same file in the new system, with the same command as above, and the linker says it cannot find two functions called maybe_assign and construct_init . If I replace the -o test option with just -c (ie without linking) then the program is compiled without errors.

More precisely, when I try to do linking I get the following errors (they were extremely long, I hade to shorten using ... dots).

In function `boost::re_detail::perl_matcher<...>::match_match()':

undefined reference to `boost::match_results<...>::maybe_assign(boost::match_results<...> const&)'


In function `bool boost::regex_search<...>(...)':

undefined reference to `boost::re_detail::perl_matcher<...>::construct_init(...)'


In function `boost::re_detail::perl_matcher<...>::match_prefix()':

undefined reference to `boost::match_results<...>::maybe_assign(boost::match_results<...> const&)'

collect2: error: ld returned 1 exit status

I really don't know how this is possible, the libraries seem perfectly installed, nothing seems missing, and the compilation was working with a previous OS installation (then I guess older libraries).

At these point my only guess could be that Boost authors removed such functions? (maybe they are obsolete?). But I didn't find any trace of this on internet. If this is the case, how can I know the boost versions in which such functions are available?

Am I doing any mistake? Do you have any suggestions to investigate about this?

TL;DR use gcc5.

Ununtu 16.04 comes with gcc5 by default. Every C++ library in it is compiled with that compiler.

Now there was an incompatible C++ ABI change between gcc4 and gcc5. It made binaries built from C++ sources with gcc4 incompatible by default with binaries built with gcc5. This incompatibility often manifests itself as a bunch of undefined symbols that reference std::string and/or std::list .

The standard library comes built with a dual ABI to support objects built with older compilers. Other libraries like boost, hovever, don't.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM