6

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

谢谢!

4

2 回答 2

6

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

这并不影响 glibc ( libc) 的版本,它与and不同。使用这些标志,您仍然生成了一个动态链接的可执行文件,预计它不能在较旧的发行版上工作。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重要。)

于 2013-04-27T06:44:26.907 回答
1

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

尝试运行以下命令:

ldd mytest

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

于 2013-04-27T00:47:56.230 回答