如果在我的计算机上编译一个C ++程序,然后在另一个程序(使用旧版软件)上运行它,则会得到:/usr/lib/libstdc++.so.6: versionGLIBCXX_3.4.9’ not found`。
/usr/lib/libstdc++.so.6: version
实际上,在我的系统上,glibc是较新的版本(我有gcc-libs 4.5.1:libstdc 。so.6.0.14),并strings /usr/lib/libstdc++.so.6 | grep GLIBCXX从打印GLIBCXX_3.4到GLIBCXX_3.4.14。相反,在另一个系统上,它只能打印到GLIBCXX_3.4.8(我得到libstdc 。so.6.0.8)。
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.14
GLIBCXX_3.4.8
所以我有几个问题:
为什么我的链接器将C 二进制文件链接到libstdc 版本GLIBCXX_3.4.9而不是链接GLIBCXX_3.4.14?
GLIBCXX_3.4.9
如果我按照libstdc ++版本编译了二进制文件,GLIBCXX_3.4我猜它几乎可以在任何地方运行。这是否意味着任何问题?(例如:是否会使用较旧的算法,从而使用更差的算法?)
相反,如果我将程序 静态 链接到我的libstdc ++,我想它会在任何地方运行;当然,二进制文件会更大(〜1MB),还有其他优点/缺点吗?
我可以强制链接器将二进制文件链接到给定版本的libstdc ++吗?
优先使用readelf -a和objdump -x检查ELF文件strings。
readelf -a
objdump -x
strings
实际上,所有GLIBCXX_ *版本都不适用于整个库,而是适用于每个符号(符号版本,请参阅DSO- howto)。因此,您可以在同一个库文件上包含eg:std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5和std::ios_base::Init::~Init()@@GLIBCXX_3.4。
std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5
std::ios_base::Init::~Init()@@GLIBCXX_3.4
您的程序需要GLIBCXX_3.4.9的事实可能意味着它已与已引入的符号链接,或已在GLIBCXX_3.4.9上更改了语义。