【问题标题】:Compiler libstdc++ version vs. system version编译器 libstdc++ 版本与系统版本
【发布时间】:2013-05-03 07:21:41
【问题描述】:

我试图了解 g++ 如何选择它链接的 libstdc++ 版本,以及当库的“系统”版本不同时意味着什么。

我使用的是 gcc/g++ 4.1.2,根据ABI Guidelines 文档,它包括 libstdc++.so.6.0.8,果然:

-rwxr-xr-x  1 root root 4397810 May 18  2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8

根据我对 ABI 前向兼容性的理解,我可以使用 g++ 4.1.2 进行构建,并希望代码能够在具有比 6.0.8 更高版本的 libstdc++ 的系统上运行,但不能在具有更早版本的系统上运行,因为这将具有旧版本的 ABI。

在同一台机器上,/usr/lib 中有旧版本的 libstdc++:

-rwxr-xr-x  1 root root 804288 Jul 22  2005 /usr/lib/libstdc++.so.6.0.3

如果我在这台机器上使用 g++ 4.1.2 编译代码,然后 ldd 它,我看到 /usr/lib 中引用的 libstdc++ 版本是 6.0.3:

# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.

这是预期的,因为首先检查 /usr/lib。并且应用程序运行良好。

我的问题是:这里发生了什么?

g++ 4.1.2 是否与 libstdc++ 的版本相关联。所以这是该版本 (6.0.8) 的一部分?如果是这样,为什么可执行文件可以在运行时使用 /usr/lib 中的旧版本,而它有旧的 ABI?运气?

或者 g++ 4.1.2 在链接时选择了 /usr/lib 版本的 libstdc++ (6.0.3) 并使用它,因为它以与运行时可执行文件相同的方式解析库路径? g++ 可以做到这一点,即使 libstdc++ 不是它的“自己的”版本? g++4.1.2(6.0.8)中的libstdc++版本的目的是什么?在这个过程中是否使用过它?

感谢任何见解。

【问题讨论】:

  • 编译器/链接器选择 6.0.8,运行时加载器选择 6.0.3。这可能会也可能不会很好地结束。要告诉运行时加载器在哪里找到库,请使用链接器的-rpath /path/to/folder/with/lib 参数(从 gcc/g++ 调用时使用-Wl,-rpath ...)。顺便说一句,4.1.2 是古老的好几倍。

标签: c++ linux compiler-construction g++ shared-libraries


【解决方案1】:

GCC 根据目录搜索列表选择所有库。你可以这样看:

gcc -print-search-dirs

该列表通常更喜欢特定于编译器版本的库,如果有的话。

但是,链接时选择可能与运行时选择不同。

如果链接器命令包含-rpath 选项(某些工具链供应商可能包含非标准选项),则动态链接器将使用它在运行时查找正确的库。否则系统将使用其默认库。

如果这两个库不匹配,那么可能会发生不好的事情。 C 库(通常是 glibc)一直很小心地保持兼容性。 C++ 库并不总是如此奢侈。近年来它更安全了,但许多人仍然建议不要混合和匹配。

【讨论】:

    【解决方案2】:

    默认情况下,gcc 使用 /usr/lib 路径中的库。
    1. gcc/g++ 4.1.2 未链接到最新版本的 libstdc++.so.6.0.8。
    2. g++ 4.1.2 在链接时获取了 /usr/lib 版本的 libstdc++ (6.0.3)。

    除非你明确设置库路径,否则它仍然使用系统默认的 libstdc++.so.6.0.3。

    对于 gcc/g++ 4.1.2,要使用最新版本的 libstdc++.so.6.0.8,您必须在编译前导出库路径。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib
    

    现在使用 gcc/g++ 4.1.2 链接时,将使用 libstdc++.so.6.0.8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2018-05-27
      • 2013-04-05
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多