如何找出哪个发行版软件包提供了给定的库

如何找出哪个发行版软件包提供了给定的库

我正在寻找一种方法来查找给定的 LDFLAG,例如-lcryptopp,为我提供该库的分发包,例如libcrypto++-dev在 Debian/Ubuntu 上。

到目前为止,我已经手动和根据常识查找了这些库,并使用例如aptitude searchapt-file searchGoogle。

但是,现在我正在构建一个虚拟机,我想在其中进行测试编译所有 Haskell 社区软件包,而且它们所依赖的 C 库比我能手动查找的还要多。

您如何以某种可靠的方式来通过链接名称查找包?

我正在研究基于 Debian 的系统,但也对其他发行版的解决方案感兴趣。任何能使这项工作更容易的东西都会受到赞赏,无论是 Web 服务、某些工具或数据库,还是有关某些文件命名的智能知识。

我知道这不能完全自动化,因为从技术上讲,两个不同的包可以提供具有相同名称的库。我可以用一些可以找到的东西来最多的包裹。

答案1

如果您已经在系统上安装了软件包:

  for pc in $(find /usr/lib/pkgconfig/ ${PKG_CONFIG_PATH//:/ } -maxdepth 1 -name "*.pc"); do
      printf "$pc " 
      pp=${pc/#*\/} 
      pp=${pp/%.pc/}
      pkg-config --modversion --libs ${pp}
      printf "\n"
  done

它会pkg-config调用系统上安装的每个.pc文件,查询每个软件包使用的库和所需的库路径(它们分别是传递给编译器/链接器的-l-L标志)。这或多或少就是典型configure脚本所做的事情(当您去泡咖啡或做其他比看着行滚动更有效的事情时)。

也可能有少数落后者不使用pkg-config,而是安装一个-config脚本:

for pkg in $(find ${PATH//:/ } -maxdepth 1 -type f -name "*-config"); do 
    printf "$pkg " 
    $pkg --version --libs
    printf "\n"
done

你仍然需要做一些 grep 来找到你正在寻找的内容,因为上面的输出是包需要传递给编译器的内容它也将包含软件包自己的依赖项。软件包本身提供的库往往会首先列出,例如

/usr/bin/xine-config 1.1.7
-L/usr/lib -lxine -lz -lresolv -lnsl -pthread -lrt
           ^^^^^^
/usr/local/lib/pkgconfig/flac.pc 1.2.1
-L/usr/local/lib -lFLAC -lm  
                 ^^^^^^

获得.pc文件或-config识别文件后,使用以下命令确认包dpkg

 dpkg -S /usr/lib/pkgconfig/libxml-2.0.pc
 libxml2-dev: /usr/lib/pkgconfig/libxml-2.0.pc

或等效的本地包管理器,例如rpm -q --whatprovides /usr/lib/pkgconfig/libxml-2.0.pc

答案2

您可以通过运行以下命令列出所有已安装的头文件的包:

find / -name '*.h' | xargs -i apt-file search {}

这将花费很长时间,但您将获得系统上安装的所有库的完整列表。您还可以列出全部.h 文件全部包装:

apt-file search --regexp '\.h$'

相关内容