我是软件开发新手,在从源代码编译大约 20 个程序和依赖项的过程中,我看到了一个粗略的模式,但我不太明白。我希望你能对此有所了解。
我在 SLC6 机器上通过 SSH 连接,没有 root 权限,我必须安装所有软件依赖项和最困难的部分 - 将它们链接到正确的位置。
例如:我需要安装log4cpp。我下载了一个 tarball 并解压它
./autogen.sh (if there isn't this one, just continue to next)
./configure
make
因此,它与源代码一起安装在文件夹本身中,只是处于休眠状态,直到我可以以正确的方式调用它。
然后我需要安装另一个程序,它要求我指定库并包含一些依赖项的目录
--with-log4cpp-inc=
--with-log4cpp-lib=
对于某些源代码编译,该文件夹有一个 lib、bin 和 inc 或包含目录 - 完美!对于某些人来说,该文件夹只有 lib 和 inc 目录。对于某些人来说,该文件夹只有 inc 目录。
当他们都有一个漂亮的文件夹,很容易找到时,我没有问题。但我经常遇到问题,比如 log4cpp。
locate log4cpp.so
返回 null(lib 目录中有 .so 文件吗?或者有吗?)
所以我有一个问题,在这个特定的实例中,库目录丢失并且我找不到它。但我每次都想知道问题是怎么解决的,也有一些背景资料。然而,当我搜索库、包含和 bin 环境变量如何工作时,我的谷歌搜索技能似乎没有返回任何结果。我也尝试查找该程序的文档,但似乎我的问题是:“lib 目录在哪里,include 目录在哪里,bin 目录在哪里?”都是如此琐碎,以至于他们甚至不需要沟通。
所以:
- 什么是包含目录,它有什么作用,包含,如何找到它。
- 什么是库目录,它有什么作用,包含什么,我如何找到它 - 每次 - 也许有用的命令。
- 什么是二进制目录,它有什么作用,包含什么,如何找到它。
答案1
库文件通常以lib
;为前缀。locate
如果您不太具体,您的命令可能会更成功: locate "*log4cpp*"
。
关于共享库(即.so
文件 - 通常但不一定是这种情况;请参阅下面的“什么是库目录?”)whereis
通常会找到适当的路径,但不支持通配符,因此您必须获得名称正确,无后缀 ( whereis liblog4cpp
)。 ldconfig -p
甚至更好,因为您直接从马口中获取信息(ldconfig
配置链接器使用的缓存,该缓存管理共享库)。
ldconfig -p | grep log4cpp
请注意,要针对该库进行构建,您还需要相关的包含标头,发行版默认情况下可能未安装该标头;这些产品是单独的-dev
或-devel
包装的。
什么是包含目录?
include 目录包含在源代码中以这种方式使用的 C 和 C++ 头文件:
#include <foobar.h>
#include <foo/bar.h>
它们被组织成层次结构,其中一些是由 (C/C++) 语言标准规定的。然而,到达层次结构顶部的路径是特定于系统的并且为编译器/预处理器所知。例如,这两个文件可能位于/usr/include/foobar.h
和 处/usr/include/foo/bar.h
。
Linux 系统通常有两个顶级包含目录在起作用,/usr/include
并且/usr/local/include
(后者优先)。
包含文件对于编译的软件来说不是必需的,只是创建它们所必需的,这就是为什么libfoobar
从发行版包安装会得到你libfoobar.so
但不是foobar.h
.它在libfoobar-dev
包中(注意,不同发行版的命名约定有所不同)。
什么是库目录?
库目录包含两种形式的库:动态(也称为共享)和静态。其中大多数是前者。它们大致对应于包含目录,但通常有更多目录(/lib
、/lib64
、/usr/lib
、/usr/local/lib
等;其中一些可能是其他目录的符号链接)。
共享库是在运行时使用的库;如果可执行文件链接到共享库,则它们(的一部分)都会根据需要加载到内存中,以便程序运行。如果某些东西已经在使用该库,则它已经在内存中,不必再次加载;这两个应用程序不会互相干扰,因为共享部分对它们来说是只读的。按照惯例,共享库使用后缀.so
.
静态库在编译时构建到可执行文件中,并且随后不需要运行可执行文件。这种情况不太常见,因为该库无法与其他应用程序共享,这可能会浪费大量 RAM。按照惯例,静态库使用后缀.a
.
什么是二进制目录?
二进制目录包含可执行程序文件,例如ls
或firefox
. *nix 世界中的可执行文件不使用后缀。这些目录通常位于$PATH
变量中,否则您将不得不一直键入/usr/bin/ls
。可以使用or命令ls
确定键入时将使用哪个可执行文件。whereis
which
如果.configure
允许您指定库或包含目录,通常只有在非标准位置时才需要这样做。 尝试不使用该选项,如果找不到,则使用该--with-inc=
选项。
答案2
从源安装包的标准流程如下:
./configure
make
- 可选:
make test
或make check
make install
在像 Debian 或 Fedora 这样的二进制发行版上,上述四个命令在一个中央位置运行,然后由发行版维护者打包以发布给公众,用户将它们作为更新或新包下载到包管理器中。在基于源的发行版(如 Gentoo 或 Arch)上,包管理器按列出的顺序运行列出的 4 个命令。
无论哪种情况,都由系统的包管理器软件来管理您跟踪的依赖项(如果您的系统有依赖项),否则您将缺少第 4 步。运行第 4 步后,可以通过配置找到 libdirs 和 bindirs您编译的所有其他包的脚本。