如果我在我的机器上编译一个C ++程序,并在另一个(使用较旧的软件)上运行它,则会得到: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
. /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
。
实际上在我的系统上glibc更新(我得到了gcc-libs 4.5.1:libstdc ++。so.6.0.14)和strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
从strings /usr/lib/libstdc++.so.6 | grep GLIBCXX
打印到GLIBCXX_3.4.14
。 在另一个系统上,它只打印到GLIBCXX_3.4.8
(我有libstdc ++。so.6.0.8)。
所以我有几个问题:
为什么我的链接程序将C ++二进制文件与libstdc ++版本GLIBCXX_3.4.9
而不是GLIBCXX_3.4.14
?
如果我GLIBCXX_3.4
libstdc ++版本GLIBCXX_3.4
编译我的二进制文件, GLIBCXX_3.4
我猜它几乎在任何地方运行。 这是否意味着任何问题? (例如:它会使用更老的algorithm,因此更糟糕的algorithm实现?)
如果相反,我静静地链接我的程序对我的libstdc ++,我想它会运行到处; 当然,这个二进制文件会更大(〜1MB),其他的优点和缺点呢?
我可以强制链接器链接我的二进制文件与给定版本的libstdc ++吗?
使用readelf -a
和objdump -x
检查ELF文件优先于strings
。
实际上,所有GLIBCXX_ *版本都不适用于整个库,而是适用于每个符号(符号版本,请参阅DSO-howto )。 所以你可以在同一个库文件中包含: 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上的语义的符号。
编辑
我只记得,静态链接库增加了内存使用量。
在我看来,如果你的二进制文件不使用新的GLIBCXX版本的新功能,那么它们将不会与该版本链接。 所以你的二进制文件与GLBCXX 3.4.9链接,必须至少有一个符号从它导出,没有从3.4.9以上的版本导出的任何符号。