编译器的libstdc ++版本与系统版本(Compiler libstdc++ version v

2019-09-02 07:36发布

我想了解G ++选择其中的libstdc ++版本它链接反对,这是什么意思时,图书馆的“系统”的版本是不同的。

我用gcc /克++ 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的旧版本。

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

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

如果我在此机器上使用克++ 4.1.2编译代码,那么它ldd的,我看到引用的的libstdc ++在/ usr / lib中的版本,这是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回升的libstdc的/ usr / lib目录++版本(6.0.3)链接时和使用的,因为它解决了同样的方式库路径,可执行文件在运行时怎么办? 能否G ++做到这一点,即使++的libstdc不是“自己”的版本? 什么是在G ++ 4.1.2(6.0.8)中的libstdc ++版本的目的是什么? 它已被用于在所有在这个过程?

任何见解表示赞赏。

Answer 1:

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

gcc -print-search-dirs

该列表通常更喜欢具体的编译器版本的库中,如果有一个。

然而,链接时选择可能不一样的运行时间选择。

如果连接器命令包括-rpath选项(某些工具链厂商可以包括非标准的一个),然后动态链接程序将使用该查找在运行时正确的库。 否则,系统将使用其默认的库。

如果这两个库都没有得到很好的匹配,那么不好的事情可能发生。 C库(通常的glibc)一直小心翼翼地保持兼容性。 C ++库并不总是有这种奢侈。 它已经安全在最近几年,但很多人还是建议混合和匹配。



Answer 2:

默认情况下,海湾合作委员会使用在/ usr / lib目录路径的库。
1. GCC /克++ 4.1.2未链接到的libstdc so.6.0.8的++。最新版本。
2.克++ 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 /克++ 4.1.2的libstdc ++。so.6.0.8将被使用。



文章来源: Compiler libstdc++ version vs. system version