c++ 项目仍然需要 -D_GLIBCXX_USE_CXX11_ABI=0

Posted

技术标签:

【中文标题】c++ 项目仍然需要 -D_GLIBCXX_USE_CXX11_ABI=0【英文标题】:Still need -D_GLIBCXX_USE_CXX11_ABI=0 for c++ projects 【发布时间】:2020-11-06 23:07:46 【问题描述】:

当我公司将我们的 gcc 升级到 6.3 时,所有 c++ 项目都添加了 -D_GLIBCXX_USE_CXX11_ABI=0 以解决 gcc 中的 ABI 损坏问题。现在我们的 gcc 是 8.2,那个标志还在项目文件中。由于项目文件太多,因此不会很快删除。我需要构建一个将由这些应用程序项目链接的第三方库。我知道出于一致性的原因,我最好使用相同的标志。但我想知道如果我不使用它,我会遇到 c++ 字符串的任何奇怪行为吗? gcc 8.2 能顺利处理这个,不管你设置还是不设置这个标志?

【问题讨论】:

【参考方案1】:

来自Dual ABI 疑难解答

如果您收到有关未定义符号引用的链接器错误 涉及 std::__cxx11 命名空间或标签 [abi:cxx11] 中的类型 那么它可能表明您正在尝试将对象链接在一起 使用不同值编译的文件 _GLIBCXX_USE_CXX11_ABI 宏。当链接到使用旧版本 GCC 编译的第三方库时,通常会发生这种情况。如果 第三方库不能用新的 ABI 重建,那么你 将需要使用旧 ABI 重新编译您的代码。

你必须重新编译整个项目和库。

【讨论】:

当我将应用程序项目链接到没有标志的库构建时,我没有看到任何错误。【参考方案2】:

该标志确保所有模块都具有相同的 C++ 容器 ABI;如果您将使用不同 ABI 的两个模块链接在一起,他们会对例如什么有不同的想法。 std::string 是(它在内存中的布局方式,它的方法是什么,...)。

混合具有不同 C++ ABI 的模块通常是一个坏主意:虽然,如果它们单独运行每个模块,而不在它们之间传递 C++ 容器,那么东西应该可以工作,尝试传递例如这些模块之间的std::string 将导致编译错误(std::string 实际上是两个 ABI 中两种不同类型的别名,因此损坏的名称会有所不同),或者在更微妙的情况下(例如,如果 @ 987654324@ 是在两个模块之间传递的结构的成员)您将在运行时崩溃/损坏。

【讨论】:

同意。在我的公司开始一项活动以在任何应用程序项目和第三方库中删除该标志之前,我将对该库使用该标志。谢谢。

以上是关于c++ 项目仍然需要 -D_GLIBCXX_USE_CXX11_ABI=0的主要内容,如果未能解决你的问题,请参考以下文章

Linux 上的 Eclipse 不显示 C++ 新项目的选项

Visual Studio 2017 c++ win32 控制台项目模板

Visual Studio 2017 c++ win32 控制台项目模板

从 Android 中的本机 c++ 文件调用本机 opencv

无法链接 GLFW C++;添加了 .dll、.h、.lib,但仍然获得 LNK2019

C++:使用来自另一个项目的函数