该程序找不到正确版本的glibc / libstdc ++,尽管它是静态链接的

时间:2013-04-27 00:33:48

标签: gcc g++ ld glibc libstdc++

我试图将我的程序与glibc静态链接,因为目标机器上的glibc版本几乎是不可预测的。我使用了链接器标志-static-libgcc和-static-libstdc ++,它运行正常。可执行文件很大,但我可以忍受它。不幸的是,当我在目标机器上运行我的可执行文件时(在下面的例子中它被命名为'mytest'),我收到以下错误:

./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_log.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by libboost_date_time.so.1.53.0)
./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by libboost_thread.so.1.53.0)

如果我在mytest上做'字符串',它会给我

$ strings mytest | grep GLIBC
GLIBC_2.9
GLIBC_2.7
GLIBC_2.8
GLIBC_2.3.2
GLIBC_2.2.5
GLIBCXX_3.4.15
GLIBCXX_3.4.11
GLIBCXX_3.4.14
GLIBCXX_3.4.9
GLIBCXX_3.4

我认为,静态链接的工作正常。为什么加载器仍然试图在共享glibc和libstdc ++中查找我的函数?我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:6)

  

我试图将我的程序与glibc静态链接,因为目标机器上的glibc版本几乎是不可预测的。我使用了链接标志-static-libgcc和-static-libstdc ++,它运行良好。

这不影响glibc(libc)的版本,该版本与libgcclibstdc++不同。使用这些标志,您仍然生成了一个动态链接的可执行文件,期望不能在旧版本的分发版上运行。

您可以将可执行文件与-static标记链接,这样就可以为您提供完全静态可执行文件。

<强>更新

重读你的问题之后;您的问题 glibc。您的问题是您要与libboost_log.so进行关联,libstdc++.so.6本身取决于libboost*.a

答案是与libboost*.so而不是g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \ -Wl,-Bdynamic 相关联。你可以试着这样做:

-Wl,-Bdynamic

(尾随{{1}}非常重要非常。)

答案 1 :(得分:1)

-static-libgcc-static-libstdc++的关联仅适用于这些库。看起来你也在连接boost库(可能是动态的),然后链接到libgcc和libstdc ++。

尝试运行以下内容:

ldd mytest

它应该显示“不是动态可执行文件”。如果它显示任何其他内容,则表示它与其他库动态链接。它并不总是如此容易,但尝试将-static添加到编译行以处理剩余的库。