在g ++ - 5-ish发行版上使用g ++ - 4.9与Boost链接时未定义的引用

时间:2016-01-24 10:51:41

标签: gcc boost static-linking boost-program-options gcc5

我写了以下开创性的应用程序:

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

我正在尝试在Debian Stretch上构建它,默认编译器是GCC 5.3.1-5,Boost的安装版本是1.58.0。

但是,由于我不会在这里讨论的原因(would be apparent这不是MCVE),我需要使用g++-4.9编译和链接二进制文件,而不是g++-5.3 。编译工作正常,但是当我尝试链接时,会发生这种情况:

/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)'
  • 这是由于gcc 4和5之间的某些ABI不兼容吗?
  • 如果是这样,除了构建我自己的Boost版本之外,还有什么方法可以绕过它吗?
  • 如果没有,会导致什么原因?

1 个答案:

答案 0 :(得分:3)

  

这是由于gcc 4和5之间的某些ABI不兼容吗?

看起来像是。默认情况下,GCC 5为几个重要的标准库类使用新的ABI,包括std::basic_string模板(因此也是std::string)。不幸的是,如果不破坏ABI,就不可能使std :: string完全符合C ++ 11及更高版本。

libstdc ++实现双ABI,因此使用旧版GCC编译的二进制文件将与新库链接(并正常工作)。有关详细信息,请参阅Jason Merrill(GCC C ++前端的维护者)的post

  

如果是这样,除了建立我自己的之外,还有什么方法可以绕过它   版本的Boost?

可能不是。 Boost取决于std::string的新实现,并且不提供向后兼容性(与libstdc ++不同)。这个问题在Debian bugtracker中是mentioned