找出库是否在路径中


15

假设我要测试某个程序是否安装了库并且可以使用它。我可以使用ldconfig -p | grep mylib它来确定它是否已安装在系统上。但是如果仅通过设置知道该库LD_LIBRARY_PATH怎么办?

在这种情况下,程序可能能够找到该库,但ldconfig找不到。如何检查库是否在组合链接器路径中?

我要补充一点是,我正在寻找一个即使我手头上没有真正的程序(例如,该程序尚未编译)也可以使用的解决方案,我只想知道某个库存在于ld“的路径。


2
您可以ldd <binary>用来检查所有链接的库是否都在路径中。也许有一种更优雅的方式。
托马斯

@Thomas我认为您应该回答您的评论。ldd正是为了这个目的。
lgeorget

1
@Thomas-但是如果我程序尚未编译怎么办,而编译需要该库呢?
nbubis '16

@Igeorget-查看我的编辑/评论
nbubis,

@nbubis:当需要库进行编译时,通常必须使用LIBRARY_PATH例如由gcc编译器查找的环境变量。该LIBRARY_PATH环境变量也有一个冒号分隔的列表。
托马斯

Answers:


15

ldconfig 可以列出它有权访问的所有库。这些库也存储在其缓存中。

/sbin/ldconfig -v -N将爬网所有常用的库路径,列出所有可用的库,而不重建缓存(如果您不是root用户,则不可能)。它没有考虑LD_LIBRARY_PATH中的库(与这篇文章在编辑前说的相反),但是您可以使用以下行将其他库传递给命令行:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig是1980年代的工具,在1990年代放弃了。因此,ldconfig它不是可移植的,因为它仅适用于a.out基于1987
。– schily

这如何帮助列出仅位于LD_LIBRARY_PATH上的库?我想我可以写一个脚本来解析它,然后通过ldconfig读取它,但这似乎有点过头了。
nbubis '16

1
@nbubis,您始终可以将LD_LIBRARY_PATH中的库传递给ldconfig。/sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)不太喜欢我的口味。
lgeorget '16

@schily真的吗?据我所知,它在ELF库中运行得很好。ld.so仍在使用,它依赖于ldconfig构建的缓存。
lgeorget '16

Linux人员入侵了旧的Sun链接器源代码以支持ELF。由于ldconfig链接器缓存对错误过于敏感,因此与AT&T达成的协议取消了Sun的新ELF实现。孙后来补充the tree stoogesmoelaricrle为ELF管理辅助程序。
schily

2

:用LD_LIBRARY_PATH 全局替换(空格)

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

您可以使用gcc编译一个简单的测试程序并链接您的库。然后,您可以使用ldd检查使用的库。我用这样的东西:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed 防止链接程序丢弃该库,因为没有使用该库中的任何符号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.