我正在将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
到正确的位置在链接行