包(package)和库(library)

包(Package)

包通常是指一种包含了软件或其组件的归档文件,里面不仅可能包括库(library)文件,还可能包含配置文件、文档、可执行文件等其他资源。包是为了方便安装和管理软件而打包的集合。包管理工具(如 apt、yum、pacman、pip 等)会管理这些包的下载、安装、卸载和更新。

库 (Library)

库是指一组可以被其他程序调用的函数、类、模块或组件。库通常是提供给开发者使用的代码集合,它们并不包含应用程序的完整功能,而是提供特定的功能或服务(如图形界面、网络通信、数据处理等)。库可以是动态库(*.so*.dll 文件)或静态库(*.a*.lib 文件)。

包和库的区别

  • 包是集合,库是组件:
    • 包是一个软件或多个软件组件的集合,可能包含库、文档、配置文件、脚本等。
    • 库是提供给程序使用的代码文件,通常用来实现某些功能或服务。
  • 包的安装是针对软件或工具的:
    • 包管理工具安装的是一个完整的软件包,其中可能包含库、工具、依赖和配置文件等。
    • 库管理工具(如 pkg-configpip)通常会帮助你安装并管理库,供程序开发使用。
  • 一个包中可能包含多个库:
    • 一个软件包可能包含一个或多个库文件。例如,在 Linux 上安装 libglib2.0-dev 包时,你安装的是 glib 库的开发版本,它可能包含多个 .h.so 文件。

实际例子:

  • libglib2.0-dev 包:
    • 这是一个包,它包含了 glib-2.0 库的开发版本,提供了头文件、库文件等,供开发者使用。
    • 安装这个包时,你安装的是 glib-2.0 库及其相关开发文件。
  • glib-2.0 库:
    • 这是一个库,它提供了一组 API,供程序使用。
    • 安装 libglib2.0-dev 包时,你会在系统中安装 glib-2.0 库及其相关文件,但这只是一个部分内容,包中还包含了其他开发文件。

安装包/库

包管理器

安装一个包最方便的方式是使用包管理器。不同的发行版选择不同的包管理工具,这些工具可以分为两大类:基于 .deb 包的工具和基于 .rpm 包的工具。

  • dpkg
    • dpkg 是 Debian 和基于 Debian 的发行版(如 Ubuntu)的低级包管理工具。它负责安装、卸载和查询 .deb 格式的软件包。
    • 特点
      • dpkg 本身不处理依赖关系。如果一个包依赖于其他包,dpkg 不会自动安装这些依赖,用户需要手动解决依赖问题。
  • APT(Advanced Package Tool)
    • APT 是 Debian 和基于 Debian 的发行版(如 Ubuntu)中用于处理包管理的高级工具,它依赖于 dpkg,并且可以自动处理软件包的依赖关系。
    • 特点
      • 自动处理依赖关系。
      • 支持从多个软件源下载和安装包,通常通过配置 /etc/apt/sources.list 文件来指定软件源。
      • 强大的缓存机制,在安装和更新时能够提高效率。
      • 支持安装和管理软件包、更新系统和清理未使用的软件包。
  • RPM(Red Hat Package Manager)
    • RPM 是 Red Hat 和基于 Red Hat 的发行版(如 CentOS、Fedora、RHEL)的包管理工具。它用于管理 .rpm 格式的包。
    • 特点:
      • rpm 主要用于低级别的软件包管理,它并不处理依赖关系。安装 .rpm 包时,如果存在依赖问题,用户必须手动解决。
      • 支持查询、验证、安装和卸载 .rpm 格式的软件包。
      • 对应的高级工具 yumdnf 会自动处理依赖关系。
  • YUM(Yellowdog Updater, Modified)
    • YUM 是 Red Hat 系列发行版(如 CentOS 和 RHEL)的包管理工具,用于安装、更新和卸载 .rpm 包。YUM 依赖于 rpm,并能够自动解决软件包的依赖关系。
    • 特点:
      • 自动处理依赖关系。
      • YUM 会从配置的仓库(例如 CentOS, RHEL 的官方仓库或第三方仓库)下载和安装软件包。
      • 可以通过 .repo 文件配置软件源。
      • 提供丰富的插件支持,用于扩展功能,如自动清理缓存等。
  • DNF(Dandified YUM)
    • DNF 是 YUM 的下一代替代工具,最早在 Fedora 中出现,后来成为 RHEL 和 CentOS 8+ 系统的默认包管理工具。它与 YUM 兼容,但具有更高效的性能和改进的依赖解决机制。*
特性/工具 dpkg APT RPM YUM DNF
基础工具 低级包管理工具 高级包管理工具 低级包管理工具 高级包管理工具 高级包管理工具
包格式 .deb .deb .rpm .rpm .rpm
依赖关系管理 自动处理依赖关系 自动处理依赖关系 自动处理依赖关系
主要发行版 Debian, Ubuntu Debian, Ubuntu Red Hat, CentOS, Fedora Red Hat, CentOS, Fedora Red Hat, CentOS, Fedora
缓存管理
命令兼容性 包含 dpkg 的功能 兼容 RPM 兼容 RPM

通过源码安装

有时,某些库可能没有在包管理器中提供,或者你需要安装特定版本的库。此时,你可以从源代码编译安装。通常你可以从官方网站或开源代码托管平台(如 GitHub)下载源码包。下载后解压并进入目录。

编译和安装:

1
2
3
4
5
6
7
8
9
# 下载源码并解压:
tar -xzvf <library-name>.tar.gz
cd <library-name>
# 配置编译选项(如果需要的话):
./configure
# 编译源码:
make
# 安装库:
sudo make install

在某些情况下,库可能会被安装到非标准位置。如果是这种情况,你可能需要在编译时设置库路径,或者将库路径添加到系统的库搜索路径(例如通过 LD_LIBRARY_PATH 环境变量或编辑 /etc/ld.so.conf 文件)。

使用 pip 或 conda 安装 Python 库

对于 Python 库,你可以通过 Python 包管理工具 pipconda 安装。pip 是 Python 官方的包管理工具,而 conda 是 Anaconda 提供的工具,支持更全面的依赖管理。

库管理工具

pkg-config 是一个用于管理和查询已安装的库的工具,常用于开发时的编译和链接过程。它的主要功能为:

  • 查询库的编译和链接信息: pkg-config 会查询指定库的相关信息,如编译时所需的头文件路径、库文件路径、以及链接时的标志等。
  • 简化构建过程: 它可以提供标准化的方式来自动获取编译和链接参数,避免开发者手动处理这些信息。
  • 避免版本冲突: 在安装多个版本的库时,pkg-config 可以帮助选择正确的版本信息,避免错误的库被链接。

基本用法

假设你已经安装了一个库,例如 glib-2.0,你可以通过 pkg-config 获取它的编译和链接信息:

1
2
3
4
5
6
7
8
9
10
11
# 查询编译时需要的参数
pkg-config --cflags glib-2.0
# 这会输出 glib-2.0 所需要的头文件路径,比如:-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include

# 查询链接时需要的参数:
pkg-config --libs glib-2.0
# 这会输出 glib-2.0 所需的库文件路径和链接参数,比如:-L/usr/lib -lglib-2.0

# 查询库的完整信息:
pkg-config --modversion glib-2.0
# 这会输出安装的 glib-2.0 的版本号,例如:2.70.0

结合编译使用

在编译程序时,你可以将 pkg-config 的输出直接传给编译器或链接器。例如,在编译一个依赖于 glib-2.0 的 C 程序时:

1
gcc -o myprogram myprogram.c $(pkg-config --cflags --libs glib-2.0)

这里,$(pkg-config --cflags --libs glib-2.0) 会自动扩展成适当的编译和链接参数,简化了开发流程。

pkg-config 如何工作

pkg-config 查找库文件时,依赖于 .pc 文件,这些文件通常位于 /usr/lib/pkgconfig//usr/share/pkgconfig/ 目录下。因此如果某个新安装的库的 .pc 文件不在默认位置,那么可以通过 PKG_CONFIG_PATH 环境变量指定库的搜索路径,例如:

1
export PKG_CONFIG_PATH=/path/to/libs/pkgconfig:$PKG_CONFIG_PATH