跳转至

pkg-config

pkg-config 是一个帮助开发人员在编译和链接程序时发现和使用库的辅助工具。它提供了一种方法来获取库的编译和链接参数,使得在编译时链接库变得更加容易和一致。pkg-config 通常用于Unix-like系统,并且支持多种编程语言。

pkg-config 的工作原理是查询一个名为.pc的文件,这些文件包含了关于库的元数据,例如库的安装位置、编译器标志、链接器标志等。当你安装一个库时,通常会在/usr/lib/pkgconfig/usr/share/pkgconfig目录下安装相应的.pc文件。

如何使用 pkg-config

查询库的编译和链接标志

使用pkg-config查询库的编译和链接标志是最常见的用途。例如,如果你想使用libopus库,你可以使用以下命令来获取编译和链接标志:

pkg-config --cflags --libs opus

这个命令会输出类似以下内容:

-I/usr/include/opus -lopus

这些标志可以直接在编译命令中使用。

编译程序

当你编译程序时,可以将pkg-config的输出直接嵌入到编译命令中。例如:

gcc `pkg-config --cflags --libs opus` -o myprogram myprogram.c

这个命令会编译一个名为myprogram的程序,并且链接libopus库。

如果使用Makefile时候,可以通过pkg-config动态获取参数:

CC = gcc
PKG_CONFIG = pkg-config
CFLAGS = $(shell $(PKG_CONFIG) --cflags opus)
LDFLAGS = $(shell $(PKG_CONFIG) --libs opus)

all: main

main: main.c
    $(CC) main.c $(CFLAGS) $(LDFLAGS) -o main

另外进行Go语言的CGO编程时候,我们可以使用 #cgo 指令结合 pkg-config,来获取链接参数:

/*
#cgo pkg-config: opus
#include <opus/opus.h>
*/
import "C"

安装和使用.pc文件

如果你正在开发一个库,并且想要让其他程序能够使用pkg-config来链接你的库,你需要创建一个.pc文件。这个文件通常包含以下内容:

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: YourLibrary
Description: A description of your library
Version: 1.0.0
Libs: -L${libdir} -lyourlib
Cflags: -I${includedir}

然后,你可以将这个文件安装到/usr/lib/pkgconfig/usr/share/pkgconfig目录下。

下面是libopus.pc文件内容:

# Opus codec reference implementation pkg-config file

prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir=${prefix}/include

Name: Opus
Description: Opus IETF audio codec (floating-point build)
URL: https://opus-codec.org/
Version: 1.3.1
Requires:
Conflicts:
Libs: -L${libdir} -lopus
Libs.private: -lm
Cflags: -I${includedir}/opus

设置环境变量

在Linux系统中,.pc文件的标准位置通常是以下几个目录之一:

  1. /usr/lib/pkgconfig:这是系统默认的库文件搜索路径之一,通常用于存放系统级库的.pc文件 。
  2. /usr/share/pkgconfig:这是另一个系统默认的库文件搜索路径,同样用于存放库的.pc文件。
  3. /usr/local/lib/pkgconfig:当库被安装在/usr/local目录下时,相应的.pc文件也会存放在这个路径下 。
  4. /usr/lib/x86_64-linux-gnu/pkgconfig:在某些系统上,特别是64位系统,.pc文件可能会存放在这个路径下 。

如果你的.pc文件不在标准位置,你可以通过设置PKG_CONFIG_PATH这个环境变量来告诉pkg-config在哪里查找它们。

export PKG_CONFIG_PATH=/path/to/your/pkgconfig/files:$PKG_CONFIG_PATH

pkg-config 是一个非常有用的工具,它可以帮助自动化处理库的发现和使用,使得构建系统更加简洁和易于维护。

其他用法

pkg-config --modversion opus # 查询库版本号

pkg-config --list-all # 查询所有库