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

sve*_*ana 6 gcc glibc g++ ld 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)
Run Code Online (Sandbox Code Playgroud)

如果我在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
Run Code Online (Sandbox Code Playgroud)

我认为,静态链接的工作原理是什么意思.为什么加载器仍然试图在共享glibc和libstdc ++中查找我的函数?我究竟做错了什么?

谢谢!

Emp*_*ian 6

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

这并不影响glibc(libc)的版本,它与和不同.使用这些标志,您仍然生成了一个动态链接的可执行文件,预计它不适用于旧版本的文件.libgcclibstdc++

您可以将您的可执行文件与-staticflag 链接,这应该为您提供完全静态的可执行文件.

更新:

重新阅读你的问题之后; 你的问题是不与glibc.你的问题是你要链接libboost_log.so,这本身就取决于你libstdc++.so.6.

然后答案是链接libboost*.a而不是libboost*.so.您可以尝试以这种方式实现它:

g++ $(OBJS) -static-libgcc -static-libstdc++ -Wl,-Bstatic -lboost_log ... \
  -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)

(尾随是非常重要的-Wl,-Bdynamic.)