Gcc 程序找不到正确版本的glibc/libstdc++;,虽然它是静态链接的
我试图将我的程序与glibc静态链接,因为目标机器上glibc的版本几乎是不可预测的。我使用了链接器标志-staticlibgcc和-staticlibstdc++,效果很好。可执行文件很大,但我可以接受。不幸的是,当我在目标机器上运行我的可执行文件时(在下面的示例中它被命名为“mytest”),我得到了以下错误: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
./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库就不能工作了。无论出于何种原因,它只有在动态链接时才能正常工作。@svetlanalibpthread
是glibc的一部分。如果您不能静态链接它,那么您就不能拥有一个完全静态的可执行文件,这意味着您的可执行文件将永远无法在较旧的系统上工作(这是不受支持的)。静态链接通常适用于多线程程序,因此您需要找出为什么它不适用于您的特定情况,或者放弃整个想法。啊,这很有趣。我从未使用过-B标志,但它可能会起作用。再次感谢:)好的,我试过你的建议了。现在我得到了./mytest:symbol lookup error:/home/sveta/mytest/lib/libstdc++.so.6:未定义的符号:_ZGVNSt8numpunctIcE2idE,版本GLIBCXX_3.4如果我尝试readelf-Ws mytest,我可以看到符号。不用说,它存在于libstdc++.so.6中。我迷路了。。。回到最初的问题:为什么不使用可执行文件的静态版本???