我必须承认,每次我必须满足某些 C 或 C++ 代码的依赖关系时,我都会感到完全迷失。目前,我正在Ubuntu 9.10(Karmic Koala),但我记得 Windows 也有同样的孤独感。
我确实认为我了解 C、C++、静态和动态库、头文件和链接,以及数据包管理器“能力”,但当涉及到实践部分时,我完全不知道该怎么做。即使我设法做到了,我也不知道我是如何做到的,也学不到任何东西。
例如,今天我想使用以下代码:“它使用 glib2、curl 和 openssl”。最后,我发现curl
和openssl
已经安装好了,但我需要libcurl3-dev
通过我的数据包管理器进行安装,这也需要(和安装),libcurl4-openssl-dev
这样我就不用担心 OpenSSL 了。但我必须从 67 个听起来相似的替代方案中选择这些数据包名称。另一方面glib
,必须手动下载和构建,因为根本没有匹配的数据包。
我花了好几个小时才发现这个问题,而且这也不是第一次了。所以我的问题实际上是:
当我对依赖关系有一个模糊的描述时:
- 我如何找出其中哪些已经安装?
- 我如何确定哪些可以通过安装包来实现?
- 我怎么知道这些包的确切名称?
- 如果必须从源代码构建包,我该如何确保不会迷失在该源的无尽依赖关系以及那些依赖关系的依赖关系中……?
- 我想我还需要将库与我的目标文件链接起来。如果一个数据包带有多个静态库文件,我如何知道(无需反复试验)要链接哪一个?
答案1
确定要安装哪些软件包以满足依赖关系并不是一门精确的科学。但有一些技巧可能会对你有所帮助:
- 当您使用满足依赖项来编译某些内容时,您几乎总是需要以 结尾的包
-dev
。这是 development 的缩写。例如,openssl
包包含用于加密的命令行工具和库。libssl-dev
包含用于 openssl 开发的头文件和库。 - 要使用 apt 按关键字搜索软件包,请使用
apt-cache search
。例如,我实际上并不知道 libssl-dev 是 openssl dev 软件包的名称。我使用此命令找到了它:apt-cache search openssl | grep dev
然后选择似乎与其他语言/库不相关的那个。 - 你可以使用 查看你安装了哪些软件包
dpkg -l
,但一般来说,只需找到你想要的软件包并告诉 apt 安装它,如果你已经安装了它,apt 会告诉你。另一个好建议是,如果你想知道哪个包拥有某个文件,请使用dpkg -S /path/to/thefile
- 如果您最终需要从源代码构建包,则没有简单的方法可以解决依赖关系树。
./configure
应该告诉您,或 README 文件。通常他们甚至会指出所需的确切包。 - 要确定要链接的内容,通常与包的名称或您想要的最通用名称有关。对于我们的 libssl 示例,您只需传递
-lssl
给 gcc。如果您不知道选项是什么-l
,请查看 /lib/(只需从前面删除“lib”并从后面删除“.so...”即可获得传递给 gcc 的“中间”)。
答案2
没人提到
aptitude build-dep
手册页条目非常全面。