Gcc 程序找不到正确版本的glibc/libstdc++;,虽然它是静态链接的

Gcc 程序找不到正确版本的glibc/libstdc++;,虽然它是静态链接的,gcc,g++,ld,glibc,libstdc++,Gcc,G++,Ld,Glibc,Libstdc++,我试图将我的程序与glibc静态链接,因为目标机器上glibc的版本几乎是不可预测的。我使用了链接器标志-staticlibgcc和-staticlibstdc++,效果很好。可执行文件很大,但我可以接受。不幸的是,当我在目标机器上运行我的可执行文件时(在下面的示例中它被命名为“mytest”),我得到了以下错误: ./mytest: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by libboo

我试图将我的程序与glibc静态链接,因为目标机器上glibc的版本几乎是不可预测的。我使用了链接器标志-staticlibgcc和-staticlibstdc++,效果很好。可执行文件很大,但我可以接受。不幸的是,当我在目标机器上运行我的可执行文件时(在下面的示例中它被命名为“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)
如果我在测试中使用“字符串”,它会给我

$ 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++中查找我的函数?我做错了什么


谢谢

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

尝试运行以下命令:

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

我试图将我的程序与glibc静态链接,因为目标机器上glibc的版本几乎是不可预测的。我使用了链接器标志-staticlibgcc和-staticlibstdc++,效果很好

这并不影响glibc(
libc
)的版本,它不同于
libgcc
libstdc++
。有了这些标志,您仍然生成了一个动态链接的可执行文件,该文件在较旧的发行版上不起作用

您可以使用
-static
标志链接可执行文件,这将为您提供一个完全静态的可执行文件

更新:

在重读你的问题之后;您的问题不在于
glibc
。您的问题是您正在链接
libboost\u log.so
,它本身依赖于
libstdc++.so.6

然后,答案是链接到
libboost*.a
,而不是
libboost*.so
。您可以尝试通过以下方式实现:

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

(将尾部的
-Wl,-b动态设置为
非常重要)

非常感谢。不幸的是,我不能静态链接所有内容,因为这样我的pthread库就不能工作了。无论出于何种原因,它只有在动态链接时才能正常工作。@svetlana
libpthread
是glibc的一部分。如果您不能静态链接它,那么您就不能拥有一个完全静态的可执行文件,这意味着您的可执行文件将永远无法在较旧的系统上工作(这是不受支持的)。静态链接通常适用于多线程程序,因此您需要找出为什么它不适用于您的特定情况,或者放弃整个想法。啊,这很有趣。我从未使用过-B标志,但它可能会起作用。再次感谢:)好的,我试过你的建议了。现在我得到了./mytest:symbol lookup error:/home/sveta/mytest/lib/libstdc++.so.6:未定义的符号:_ZGVNSt8numpunctIcE2idE,版本GLIBCXX_3.4如果我尝试readelf-Ws mytest,我可以看到符号。不用说,它存在于libstdc++.so.6中。我迷路了。。。回到最初的问题:为什么不使用可执行文件的静态版本???