共享库 links 或无法 link 与另一个共享库,具体取决于那个共享库的名称规范
shared library links or fails to link with another shared library, depending of that one's namespec
在我从源代码 (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' 中看不到任何合适的内容,并且(似乎)在网络搜索中没有任何直接相关的内容。
Now, if I just replace '-lnixutil' with 'src/libutil/libnixutil.so', linking completes okay. What's the difference
区别在于 -lnuxutil
会在不同的目录中搜索库,而 src/libutil/libnixutil.so
不会。
由于使用 -lnuxutil
在找到库时无法 link,因此可以安全地假设它在 src/libutil
以外的其他地方找到了该库的版本,并且它找到的版本可能是错误的(即旧版本)。
要查看 linker 找到 libnixutil
,请使用 -Wl,-t
标志(它将按原样显示所有输入文件被 linker 打开)。
在我从源代码 (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' 中看不到任何合适的内容,并且(似乎)在网络搜索中没有任何直接相关的内容。
Now, if I just replace '-lnixutil' with 'src/libutil/libnixutil.so', linking completes okay. What's the difference
区别在于 -lnuxutil
会在不同的目录中搜索库,而 src/libutil/libnixutil.so
不会。
由于使用 -lnuxutil
在找到库时无法 link,因此可以安全地假设它在 src/libutil
以外的其他地方找到了该库的版本,并且它找到的版本可能是错误的(即旧版本)。
要查看 linker 找到 libnixutil
,请使用 -Wl,-t
标志(它将按原样显示所有输入文件被 linker 打开)。