我最近将 Ubuntu 从 15.04 更新到 15.10。这些版本之间的主要区别之一是默认 gcc 版本的更新从 gcc-4.9 -> gcc-5。我正在开发的库是为 gcc-4.9 编写和编译的,并且依赖于其他仅适用于 gcc-4.9 的库。
我已经在我的计算机上安装了 gcc-4.9,我可以成功地编译库和我的源文件。但是,当我尝试运行生成的程序时,出现此错误:
terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
what(): basic_ios::clear: iostream error
Aborted (core dumped)`
源代码和我尝试在此处读取的文件在升级之前曾经工作。我尝试使用 -D_GLIBCXX_USE_CXX11_ABI=0
标志,但我不确定这是正确的做法,它也不起作用。
这是我目前包含在 makefile 中的标志的示例:
CPPFLAGS = -O0 -g3 -Wall -c -fpermissive -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++0x -fPIC -MMD -MP
有什么想法可以帮助我吗?
你"简单地"需要重新编译你的程序需要C++的所有内容。
参见例如 Debian 维基 关于转换,它有(除其他外)
好消息是,GCC 5 现在提供了稳定的 libcxx11 ABI,以及对 C++11 的稳定支持(GCC 5 之前的版本称为支持的实验性)。这需要对libstdc++ ABI进行一些更改,现在libstdc++6提供了双ABI,经典的libcxx98 ABI,而新的libcxx11(GCC 5(<<5.1.1-20)仅提供经典的libcxx98 ABI)。坏消息是,经典libcxx98 ABI中的(实验性)C++11支持和新的稳定libcxx11 ABI不兼容,并且上游除了重建之外不提供升级路径。
没有捷径可走。