我将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上工作正常。
有什么想法吗?
答案 0 :(得分:1)
g ++无法从libz中找到符号。
您在链接行的错误位置libz
,默认情况下Ubuntu将其gcc配置为将--as-needed
传递给链接器。
您可以运行readelf -d PrtReporter | grep libz
并验证libz.so
是否缺失(即加载程序甚至不会尝试加载它)。
要解决此问题,请将-Wl,--no-as-needed
或(更好)移动libz
添加到链接行的正确位置。