编译libstdc ++版本与系统版本

我试图了解g ++如何select链接到哪个版本的libstdc ++,以及当库的“系统”版本不同时它是什么意思。

我使用的是gcc / g ++ 4.1.2,根据ABI指南文档,它包含了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编译,期望代码能够在系统上运行,而系统的libstdc ++版本高于6.0.8,而不是早期版本,因为将有一个旧版本的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)的一部分? 如果是这样,那么当运行时,如果可执行文件有较旧的ABI,那么可执行文件如何在/ usr / lib中使用旧版本? 运气?

或者g ++ 4.1.2在链接时拾取了libstdc ++(6.0.3)的/ usr / lib版本并使用它,因为它parsing库path的方式与可执行文件在运行时的相同? 即使libstdc ++不是它自己的版本,g ++也可以这么做吗? g ++ 4.1.2(6.0.8)中的libstdc ++版本的目的是什么? 它在这个过程中是否被使用过?

任何见解赞赏。

Solutions Collecting From Web of "编译libstdc ++版本与系统版本"

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

 gcc -print-search-dirs 

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

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

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

如果两个库不匹配,那么可能会发生不好的事情。 C库(通常是glibc)一直很小心地保持兼容性。 C ++库并不总是有这种奢侈。 近年来比较安全,但很多人还是推荐不要混搭。

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

它仍然使用系统默认的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。