pkg-config
https://people.freedesktop.org/~dbn/pkg-config-guide.html
存在的意义
对于大型的第三方库,会包含很多库文件以及头文件,由于操作系统的不同,安装路径可能存在不一致的情况,直接 把路径写死在Makefile文件是很不明智的,所以需要有个中间层,由中间命令来返回库的位置。
使用
gcc -c main.cpp -o main `pkg-config --cflags -libs test001`
这样子就能保证Makefile的命令不需要做任何改变,即使test001安装在不同的位置
至于pkg-config 就是返回一个字符串作为gcc的参数
例如

工作原理
pkg-config会根据配置返回对应的参数信息,所有模块都需要提供一个 模块名称.pc文件,pkg-config根据配置文件获取模块的链接信息, 加载路径配置在PKG_CONFIG_PATH 环境变量中。可以自己添加,系统默认加载路径为:
/usr/lib64/pkgconfig
/usr/share/pkgconfig
不同的系统路径可能不一样。
配置文件规范
# This is a comment
prefix=/home/hp/unst # this defines a variable
exec_prefix=${prefix} # defining another variable in terms of the first
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: GObject # human-readable name
Description: Object/type system for GLib # human-readable description
Version: 1.3.1
URL: http://www.gtk.org
Requires: glib-2.0 = 1.3.1
Conflicts: foobar <= 4.5
Libs: -L${libdir} -lgobject-1.3
Libs.private: -lm
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib/include
Name: 该模块的名字,比如你的pc名字是xxxx.pc,那么名字最好也是xxxx。
Description: 模块的简单描述。上文pkg-config –list-all命令出来的结果,每个名字后面就是description。
URL: 用户可以通过该URL获得更多信息,或者下载信息。也是辅助的,可要可不要。
Version: 版本号。
Requires: 该模块有木有依赖于其他模块。一般没有。
该参数的作用:!!!!!
通过命令行获取头文件以及库文件时,例如 pkg-config --libs xxx 会检查 Requires的依赖是否满足。
Requires.private: 该模块有木有依赖于其他模块,并且还不需要第三方知道的。一般也没有。
Conflicts: 有没有和别的模块冲突。常用于版本冲突。比如,Conflicts: bar < 1.2.3,表示和bar模块的1.2.3以下的版本有冲突。
Cflags: 这个就很重要了。pkg-config的参数–cflags就指向这里。主要用于写本模块的头文件的路径。
Libs: 也很重要,pkg-config的参数–libs就指向这里。主要用于写本模块的库/依赖库的路径。
Libs.private: 本模块依赖的库,但不需要第三方知道。
其实必须写的只有5个。`Name、Description、Version、Cflags、Libs`
官方文档
https://linux.die.net/man/1/pkg-config

浙公网安备 33010602011771号