Undefined reference when linking with Boost using g++-4.9 on a g++-5-ish distribution

北城余情 提交于 2019-12-13 02:15:21

问题


I've written the following groundbreaking application:

#include <boost/program_options.hpp>
int main(int argc, char** argv)
{
    boost::program_options::options_description generic_options("foo");
    return 0;
}

I am trying to build this on Debian Stretch, on which the default compiler is GCC 5.3.1-5, and the installed version of Boost is 1.58.0.

However, for reasons which I will not go into here (which would be apparent had this not been a MCVE), I need to compile and link the binary using g++-4.9, not g++-5.3. Compiling works fine, but when I try to link, this is what happens:

/usr/bin/g++-4.9   -Wall -std=c++11   CMakeFiles/tester3.dir/src/altmain2.cpp.o  -o bin/tester3 -rdynamic -lboost_log -lboost_system -lboost_program_options 
CMakeFiles/tester3.dir/src/altmain2.cpp.o: In function `main':
altmain2.cpp:(.text+0x61): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)'
  • Is this due to some ABI incompatibility between gcc 4 and 5?
  • If so, is there any way to get around it other than building my own version of Boost?
  • If not, what could cause this?

回答1:


Is this due to some ABI incompatibility between gcc 4 and 5?

Looks like it is. By default GCC 5 uses a new ABI for several important standard library classes, including std::basic_string template (and thus also std::string). Unfortunately it would be impossible to make std::string fully conform to C++11 and later without breaking the ABI.

libstdc++ implements dual ABI, so that binaries compiled with older versions of GCC will link (and work correctly) with the new library. See this post by Jason Merrill (the maintainer of GCC's C++ front end) for details.

If so, is there any way to get around it other than building my own version of Boost?

Probably not. Boost depends on the new implementation of std::string and does not provide backward compatibility (unlike libstdc++). This problem is mentioned in Debian bugtracker.



来源:https://stackoverflow.com/questions/34974854/undefined-reference-when-linking-with-boost-using-g-4-9-on-a-g-5-ish-distrib

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!