解释 SUSE SLED 11 SP2 上的 g++ 与 Ubuntu 14.04 之间的区别

Explaining a difference between g++ on SUSE SLED 11 SP2 versus Ubuntu 14.04

我正在使 Ubuntu 14.04 OS 达到构建标准。它的目标是取代现有的 SUSE SLED 11 SP2 构建器。但是我遇到了一个很难解释的错误。

产生错误的构建命令是

g++
-o
out/linux-rel/bin/PrtReporter
-fstack-protector
-m32
-Wl,-rpath,/local/out/linux-rel/bin
-l:libz.so.1.2.8
out/linux-rel/obj-static/prt/CrashReporter.o
out/linux-rel/obj-static/prt/LibArchiveWrapper.o
out/linux-rel/obj-static/utilities/RTSConfigUtilities.o
-Lout/linux-rel/bin
-Lout/linux-rel/bin
out/linux-rel/bin/libcurl.so
out/linux-rel/bin/libcurl.a
out/linux-rel/bin/libarchive.a
-lpthread
-lrt
-lxml2

在 Ubuntu 这会导致 link 错误。 g++ 无法从 libz 中找到符号。

为了解决这个问题,我可以简单地在 out/linux-rel/bin/libarchive.a 之后放置 -l:libz.so.1.2.8。这 'looks' 正确,因为它允许 libarchive.a 找到 libz 符号。即我认为应该在依赖它们的库之后列出。

但我不知道为什么 Ubuntu 需要这样做。同样的命令在 SLED 上工作正常。

有什么想法吗?

g++ cannot find the symbols from libz.

libz 在 link 行的错误位置,并且 Ubuntu 配置他们的 gcc 以将 --as-needed 传递给 link er默认。

您可以 运行 readelf -d PrtReporter | grep libz 并验证 libz.so 是否丢失(即加载程序甚至不会尝试加载它)。

要修复,请添加 -Wl,--no-as-needed 或(更好)将 libz 移动到 link 行上的正确位置。