我写了以下开创性的应用程序:
#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)'
答案 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。