我试图了解 g++ 如何选择它链接的 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 构建,并期望代码能够在具有比 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 在链接时选择了 libstdc++ (6.0.3) 的 /usr/lib 版本并使用它,因为它以与运行时可执行文件相同的方式解析库路径?g++ 可以做到这一点,即使 libstdc++ 不是它的“自己的”版本?g++4.1.2(6.0.8)中的libstdc++版本的目的是什么?在这个过程中是否使用过它?
任何见解表示赞赏。