解释 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 行上的正确位置。
我正在使 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 行上的正确位置。