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

时间:2016-08-11 16:37:35

标签: ubuntu linker g++ linker-errors suse

我将Ubuntu 14.04操作系统带到了构建标准。目标是替换现有的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上,这会导致链接错误。 g ++无法从libz中找到符号。

要解决这个问题,我可以在out / linux-rel / bin / libarchive.a之后放置-l:libz.so.1.2.8。这看起来'正确',因为它允许libarchive.a找到libz符号。即我相信应该在依赖它们的图书馆之后列出。

但我不知道为什么在Ubuntu上这是必要的。相同的命令在SLED上工作正常。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

g ++无法从libz中找到符号。

您在链接行的错误位置libz,默认情况下Ubuntu将其gcc配置为将--as-needed传递给链接器。

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

要解决此问题,请将-Wl,--no-as-needed或(更好)移动libz添加到链接行的正确位置。