diff --git a/docs/cheatsheet/pkg-config.md b/docs/cheatsheet/pkg-config.md new file mode 100644 index 0000000..95821c4 --- /dev/null +++ b/docs/cheatsheet/pkg-config.md @@ -0,0 +1,121 @@ +# pkg-config + +`pkg-config` 是一个帮助开发人员在编译和链接程序时发现和使用库的辅助工具。它提供了一种方法来获取库的编译和链接参数,使得在编译时链接库变得更加容易和一致。`pkg-config` 通常用于Unix-like系统,并且支持多种编程语言。 + +`pkg-config` 的工作原理是查询一个名为`.pc`的文件,这些文件包含了关于库的元数据,例如库的安装位置、编译器标志、链接器标志等。当你安装一个库时,通常会在`/usr/lib/pkgconfig`或`/usr/share/pkgconfig`目录下安装相应的`.pc`文件。 + +## 如何使用 `pkg-config` + +### 查询库的编译和链接标志 + +使用`pkg-config`查询库的编译和链接标志是最常见的用途。例如,如果你想使用`libopus`库,你可以使用以下命令来获取编译和链接标志: + +```bash +pkg-config --cflags --libs opus +``` + +这个命令会输出类似以下内容: + +```bash +-I/usr/include/opus -lopus +``` + +这些标志可以直接在编译命令中使用。 + +### 编译程序 +当你编译程序时,可以将`pkg-config`的输出直接嵌入到编译命令中。例如: + +```bash +gcc `pkg-config --cflags --libs opus` -o myprogram myprogram.c +``` + +这个命令会编译一个名为`myprogram`的程序,并且链接`libopus`库。 + + +如果使用`Makefile`时候,可以通过`pkg-config`动态获取参数: + +```makefile +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`,来获取链接参数: + +```go +/* +#cgo pkg-config: opus +#include +*/ +import "C" +``` + +### 安装和使用.pc文件 +如果你正在开发一个库,并且想要让其他程序能够使用`pkg-config`来链接你的库,你需要创建一个`.pc`文件。这个文件通常包含以下内容: + +```ini +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`文件内容: + +```ini +# 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`在哪里查找它们。 + +```bash +export PKG_CONFIG_PATH=/path/to/your/pkgconfig/files:$PKG_CONFIG_PATH +``` + +`pkg-config` 是一个非常有用的工具,它可以帮助自动化处理库的发现和使用,使得构建系统更加简洁和易于维护。 + +### 其他用法 + +```bash +pkg-config --modversion opus # 查询库版本号 + +pkg-config --list-all # 查询所有库 +``` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index a7769f3..1c58ed4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -246,6 +246,7 @@ nav: - GDB: cheatsheet/gdb.md - CMake: cheatsheet/cmake.md - Katex: cheatsheet/KaTex常用公式编辑.ipynb + - "PKG-CONFIG": cheatsheet/pkg-config.md - QA: - redis: qa/redis.md - mysql: qa/mysql.md