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

2023-12-30

我正在尝试将我的程序与 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++ 中查找我的函数?我究竟做错了什么?

Thanks!


我正在尝试将我的程序与 glibc 静态链接,因为目标计算机上的 glibc 版本几乎不可预测。我使用了链接器标志 -static-libgcc 和 -static-libstdc++ 并且工作正常。

这并不影响 glibc 的版本(libc),即不同的 from libgcc and libstdc++。使用这些标志,您仍然生成了动态链接的可执行文件,即expected不能在较旧的发行版上工作。

您可以将您的可执行文件链接到-static标志,这应该给你一个完全地静态可执行文件。

Update:

重新阅读您的问题后;你的问题是not with glibc。你的问题是你正在链接libboost_log.so,这本身取决于libstdc++.so.6.

答案是链接到libboost*.a代替libboost*.so。您可以尝试通过以下方式实现:

g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \
  -Wl,-Bdynamic

(It is very重要的是有尾随-Wl,-Bdynamic.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

该程序无法找到正确版本的 glibc/libstdc++,尽管它是静态链接的 的相关文章

随机推荐