强制G ++(GCC)到特定的libstdc ++版本(GLIBCXX_*)

Ine*_*ion 7 gcc g++ libstdc++

我正在尝试使用GCC 4.9.0构建一个向后兼容的二进制文件libstdc++.根据GCC的ABI策略和指南以及控制C++方言的选项,命令行选项-fabi-version应该可以解决问题; 但是,无论我设置哪个版本,我仍然可以从更新的版本导入符号,如下所示:

$ objdump -T binary | grep GLIBCXX_3.4.20
00000000      DF *UND*  00000000  GLIBCXX_3.4.20 _ZSt24__throw_out_of_range_fmtPKcz
Run Code Online (Sandbox Code Playgroud)

我试图-fabi-version=1-fabi-version=5(ABI版本5个对应于GCC 4.6,这是保证是存在于目标系统上),但这些进口保持在所得到的文件卷绕.

我该如何解决?由于其他原因,回到旧的GCC版本不是我的选择.

Jon*_*ely 4

命令行选项-fabi-version应该可以解决问题

不,这与你想要的完全无关。该选项会影响编译器生成的代码,并不意味着您可以链接到旧版本的 libstdc++(这是您需要的,以便停止依赖较新的 libstdc++ 中的符号)。

您无法使用新的 GCC 链接到旧的 libstdc++。libstdc++ 的版本与 GCC 的版本紧密耦合,因此如果您想链接到较旧的 libstdc++,那么您需要使用较旧的 GCC 进行编译。

您不能告诉 libstdc++ 不要使用新符号,它依赖它们的原因是因为它需要它们。使用较旧的 libstdc++。

由于其他原因,我无法选择回到旧的 GCC 版本。

那你就完蛋了。

您要么需要使用较旧的 GCC,要么不动态链接到libstdc++.so.

在 Red Hat Enterprise Linux 或 CentOS 上,您可以选择使用开发人员工具集中的较新 GCC,这可以避免链接到新版本,libstdc++.so但仅与系统 GCC 兼容,即适用于 RHEL6 的 GCC 4.4 或适用于 RHEL7 的 GCC 4.7。你不能用它来兼容GCC 4.6。