【发布时间】:2018-12-17 03:26:37
【问题描述】:
我需要使用较新版本的 GCC (7.3.1) 来链接由 GCC 4.8 编译的库。对于 libstdc++ ABI,我只需要设置 _GLIBCXX_USE_CXX11_ABI=0 宏,但是语言 ABI(-fabi-version)呢?我是否需要将 -fabi-version 设置为旧编译器使用的相同版本,或 -fabi-compat-version? 谢谢。
【问题讨论】:
-
据我所知,实际上不可能混合所有这些。如果您使用 STL,则需要新的 ABI 才能运行所有功能。在启用旧 ABI 的情况下编译它会导致错误或减少功能集。为什么不能编译当前版本的所有库?
-
因为我正在为只有 GCC 4.8 的发行版进行编译。重新编译整个系统不是一种选择。 AFAIK 如果您链接的所有库也使用旧的 libstdc++ ABI(这是我的情况),那么旧的 libstdc++ ABI 应该没有任何问题。您将只使用 std::string 和 sts::list 的旧实现。无论如何,我问的是语言 ABI,而不是 libstdc++ ABI。
-
在这种情况下,我建议您并行安装旧编译器,并将其用作您维护的旧系统的交叉编译器。混合需要不同 ABI 的代码不是一个好主意。但是如果你说你需要使用需要更改 ABI 的 C++14 并且想在不能使用此 ABI 的系统上运行它,你根本无法继续!
-
但是 -fabi-version 选项 (gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html) 不是我需要的吗?它允许较新版本的 GCC 使用旧 ABI 进行编译,还是我遗漏了什么?
-
但是如果您使用需要新 ABI 的新功能,它就无法工作。您尝试使用需要新 ABI 的 c++14。那么,如果编译器无法将所需的信息放入目标文件中,它应该如何工作呢?