(如何)我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?
Posted
技术标签:
【中文标题】(如何)我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?【英文标题】:(How) Can I use the new C++ 11 ABI with devtoolset-7 on Centos/RHEL? 【发布时间】:2018-03-20 20:51:27 【问题描述】:我的目标是在 Centos 7 上使用 gcc 7.2(和 clang 6)来构建与 Centos 7 目标兼容的可执行文件,而无需安装 devtoolset,但 * 使用较新的 C++ ABI *。
较新的 ABI 修复了 lib 中的几个缺陷,如果不更改 ABI,这些缺陷将无法修复。例如 list::size O(1) Vs O(n),字符串没有 COW。
我在下面的问题中推测了为什么这可能不可能的答案。 -D_GLIBCXX_USE_CXX11_ABI=1 ineffective for devtoolset-7 on CentOS 7
【问题讨论】:
我从来没有遇到过使用 devtoolset-7(使用-std=c++14
)构建和在没有工具集的其他机器上运行的问题。有什么问题?
使用 _GLIBCXX_USE_CXX11_ABI=0 devtoolset 可以很好地使用旧的 stdlib 以及用于更新 API 功能的增量非共享库。但是使用新的 ABI (=1),我建议不再是这种情况,因为旧的 stdlib 与新的 lib 二进制不兼容。最初的问题表明设置新行为不起作用并被忽略。
@Praetorian,您的 cmets 非常具有误导性。默认情况下,每个 libstdc++.so
都支持 both _GLIBCXX_USE_CXX11_ABI=1
和 _GLIBCXX_USE_CXX11_ABI=0
,因此已经与系统 libstdc++.so 兼容,您不需要在构建 libstdc++(或 GCC)时设置该宏。这个问题确实是 devtoolset 及其混合的静态/动态链接模型所特有的。
@JonathanWakely 感谢您的澄清;我真的很高兴你遇到了这个问题,我们现在有了一个权威的答案。我已经删除了我之前的 cmets。
【参考方案1】:
这似乎与您链接到的问题重复,我认为没有任何理由让两者都保持打开状态。
我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?
没有。 cxx11
ABI 会影响到 libstdc++.so
内部的许多事物(特别是语言环境方面),而 devtoolset 混合链接模型无法支持这些事物。初始化语言环境的相关函数已经存在于系统libstdc++.so
中,并且不能被devtoolset 的libstdc++_nonshared.a
替换。正因为如此(并且为了避免我们不想影响 RHEL/CentOS 用户的其他潜在 ABI 不匹配),我们在 devtoolset 中禁用了新的 ABI(如 the answer to the other question 中正确说明的那样)。
如果你真的需要新的 cxx11
ABI,你需要构建自己的 GCC 7,它使用正常的动态链接到它自己的 libstdc++.so
(而不是 devtoolset 使用的混合链接模型),然后确保新的libstdc++.so 在运行时使用(参见手册中的Finding Dynamic or Shared Libraries)。
【讨论】:
感谢@Jonathan Wakely!我需要一些澄清,拜托。如果我理解得很好,唯一担心不使用新的cxx11
ABI 是使用list::size()
O(n) 而不是 O(1),COW 用于字符串和您提到的语言环境方面。除此之外,使用 devtoolset-7 和-std=gnu++14
在 CentOS/RHEL 6.0 上编译的二进制文件是否可以在 6.X 和 7.X 的其余部分中正确运行?如果使用list::size()
等等,我只需要担心性能,对吧?以上是关于(如何)我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CentOS / RHEL 中启用/禁用 CPU(限制 CPU 数量)
如何在 CentOS / RHEL 上设置 SSH 免密码登录