共享库链接或无法与另一个共享库链接,具体取决于该共享库的名称规范

问题描述 投票:0回答:1

在我从源代码构建的项目(Nix 2.3 FWIW)中,一个共享库(libnixstore.so)与另一个共享库(libnixutil.so)链接在一起。命令行是:

x86_64-slackware-linux-g++ -std=c++17 -o /d/tmp/SBo/nix-2.3/src/libstore/libnixstore.so -shared -L/usr/lib64 -Wl,--no-copy-dt-needed-entries src/libstore/binary-cache-store.o src/libstore/build.o src/libstore/builtins/buildenv.o src/libstore/builtins/fetchurl.o src/libstore/crypto.o src/libstore/derivations.o src/libstore/download.o src/libstore/export-import.o src/libstore/gc.o src/libstore/globals.o src/libstore/http-binary-cache-store.o src/libstore/legacy-ssh-store.o src/libstore/local-binary-cache-store.o src/libstore/local-fs-store.o src/libstore/local-store.o src/libstore/machines.o src/libstore/misc.o src/libstore/nar-accessor.o src/libstore/nar-info-disk-cache.o src/libstore/nar-info.o src/libstore/optimise-store.o src/libstore/parsed-derivations.o src/libstore/pathlocks.o src/libstore/profiles.o src/libstore/references.o src/libstore/remote-fs-accessor.o src/libstore/remote-store.o src/libstore/s3-binary-cache-store.o src/libstore/sqlite.o src/libstore/ssh-store.o src/libstore/ssh.o src/libstore/store-api.o -lsqlite3 -ldl -lbz2 -lcurl  -pthread -ldl -lseccomp -Wl,-z,defs -Wl,-soname=libnixstore.so    -Wl,-rpath,/d/tmp/SBo/nix-2.3/src/libutil -Lsrc/libutil -lnixutil

此命令行是'configure'脚本生成的。但是,这失败了,提示无法从“ libnixutil.so”中找到许多符号。未解析的符号实际上已经存在,并且进行了正确的处理(我检查了'nm'和'readelf')。现在,如果我只是将'-lnixutil'替换为'src / libutil / libnixutil.so',链接就可以了。有什么区别,是否已记录在案?我认为'man ld'中没有合适的东西,(似乎)没有与网络搜索直接相关的东西。

gcc shared-libraries dynamic-linking missing-symbols
1个回答
0
投票

现在,如果我仅将'-lnixutil'替换为'src / libutil / libnixutil.so',则链接完成。有什么区别

不同之处在于-lnuxutil在各种目录中搜索库,而src/libutil/libnixutil.so不在。

由于使用-lnuxutil失败,因此可以安全地假定它在src/libutil之外的某个地方找到了该库的版本,并且发现的版本可能是错误的(即,较旧的版本)。

要查看链接器找到libnixutil,请使用-Wl,-t标志(它将显示所有由链接器打开的输入文件)。

© www.soinside.com 2019 - 2024. All rights reserved.