【问题标题】:Forcing G++ (GCC) to a specific libstdc++ version (GLIBCXX_*)强制 G++ (GCC) 到特定的 libstdc++ 版本 (GLIBCXX_*)
【发布时间】:2014-06-27 14:58:25
【问题描述】:

我正在尝试使用 GCC 4.9.0 构建一个与 libstdc++ 向后兼容的二进制文件。根据 GCC 的 ABI Policy and GuidelinesOptions Controlling C++ Dialect,命令行选项 -fabi-version 应该可以解决问题;但是,无论我设置哪个版本,我仍然会从比所需版本更新的版本中导入符号,如下所示:

$ objdump -T binary | grep GLIBCXX_3.4.20
00000000      DF *UND*  00000000  GLIBCXX_3.4.20 _ZSt24__throw_out_of_range_fmtPKcz

我已经尝试过 -fabi-version=1-fabi-version=5(ABI 版本 5 对应于 GCC 4.6,它保证存在于目标系统上),但这些导入一直在结果文件中结束。

我该如何解决这个问题?由于其他原因,我不能选择回到旧的 GCC 版本。

【问题讨论】:

标签: gcc g++ libstdc++


【解决方案1】:

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

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

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

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

出于其他原因,我不能选择回到旧的 GCC 版本。

那你就完蛋了。

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

在 Red Hat Enterprise Linux 或 CentOS 上,您可以选择使用 Developer Toolset 中更新的 GCC,它可以避免链接到新的 libstdc++.so,但它仅与系统 GCC 兼容,即 GCC 4.4 for RHEL6 或用于 RHEL7 的 GCC 4.7。你不能用它来兼容 GCC 4.6。

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    相关资源
    最近更新 更多