解释g++在SUSE SLED 11 SP2和Ubuntu 14.04上的区别



我正在将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。这看起来是正确的,因为它允许libchive。找到libz符号。例如,我认为它们应该列在依赖它们的库之后。

但是我不知道为什么这在Ubuntu上是必要的。相同的命令在SLED上运行良好。

任何想法?

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

你把libz放在了链接行错误的位置,Ubuntu配置他们的gcc默认将--as-needed传递给链接器

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

要修复,添加-Wl,--no-as-needed或(更好)移动libz到正确的位置在链接行

相关内容

  • 没有找到相关文章

最新更新