如何使用旧 ABI 编译 GCC 5 的 boost?

Posted

技术标签:

【中文标题】如何使用旧 ABI 编译 GCC 5 的 boost?【英文标题】:How to Compile boost with GCC 5 using old ABI? 【发布时间】:2016-03-30 12:34:20 【问题描述】:

我下载了一个在 GCC 中的 ABI 更改之前使用 gcc 4.8 编译的库。

在我的笔记本电脑(最新的 kubuntu)上,我安装了 GCC 5.2。当我安装 boost 时,它似乎使用了新的 ABI,但随后出现以下链接错误

未定义符号.....__cxx11....

如何使用带有 GCC5 的旧 ABI 安装 boost?

【问题讨论】:

【参考方案1】:

据我所知,官方 Kubuntu 存储库中没有针对旧 ABI 的预构建 Boost 包,因此您必须自己构建 Boost。构建过程记录在here。

确保您构建的 Boost 版本与构建库时使用的版本相同。如果定义了任何 Boost 配置宏,您还必须以类似的方式定义它们。否则,您可能会遇到库与您构建的 Boost 之间的 ABI 不兼容问题。

为了将 libstdc++ 切换到旧 ABI,您还必须将 _GLIBCXX_USE_CXX11_ABI 定义为 0,如 here 所述。例如:

b2 -j8 variant=release define=_GLIBCXX_USE_CXX11_ABI=0 stage

您还需要在构建自己的使用 Boost 和库的代码时定义宏。

define 属性以及许多其他属性均记录在 here。

【讨论】:

感谢您的正确回答。 “定义”是我正在寻找的配置选项。我想为可能需要其他选项的人添加此链接。 boost.org/build/doc/html/bbv2/overview/invocation.html

以上是关于如何使用旧 ABI 编译 GCC 5 的 boost?的主要内容,如果未能解决你的问题,请参考以下文章

删除 GCC ABI 更改的注释

GCC编译宏_GLIBCXX_USE_CXX11_ABI背景分析和实现原理

GCC编译宏_GLIBCXX_USE_CXX11_ABI背景分析和实现原理

GCC编译宏_GLIBCXX_USE_CXX11_ABI背景分析和实现原理

将程序链接到库,每个库使用不同的 _GLIBCXX_USE_CXX11_ABI

带有 abi:cxx11 的 GCC 未定义引用