1、命令简介
pkg-config:用于获取编译和链接软件包的信息的命令行工具。它通常用于开发过程中,以帮助构建和编译依赖于其他库的程序。
2、命令语法
pkg-config [--modversion] [--help] [--print-errors] [--silence-errors] [--cflags] [--libs] [--libs-only-L] [--libs-only-l] [--cflags-only-I] [--variable=VARIABLENAME] [--define-variable=VARIABLENAME=VARIABLEVALUE] [--uninstalled] [--exists] [--atleast-version=VERSION] [--exact-version=VERSION] [--max-version=VERSION] [LIBRARIES...]
3、命令描述
pkg-config
程序用于检索关于系统中已安装的库的信息。通常用于编译和链接一个或多个库。以下是在Makefile中的典型用法示例:
program: program.c
cc program.c `pkg-config --cflags --libs gnomeui`
pkg-config
从特殊的元数据文件中获取有关软件包的信息。这些文件以软件包的名称命名,扩展名为.pc
。默认情况下,pkg-config
在目录prefix/lib/pkgconfig
中查找这些文件;它还将查找由PKG_CONFIG_PATH
环境变量指定的以冒号分隔(在Windows上是分号分隔)的目录列表。
pkg-config
命令行上指定的软件包名称被定义为元数据文件的名称,减去.pc扩展名。如果一个库可以同时安装多个版本,它必须为每个版本指定自己的名称(例如,GTK 1.2 可能具有软件包名称 "gtk+",而 GTK 2.0 具有 "gtk+-2.0")。
注意:这是一种在Makefile中使用pkg-config
的典型示例,用于检索编译和链接所需库的编译和链接标志。
4、命令选项
选项 | 描述 |
--modversion | 请求在命令行上显示指定库的版本信息。 如果 pkg-config 可以找到命令行上的所有库, 每个库的版本字符串都会打印到 stdout, 每行一个版本。在这种情况下, pkg-config 会成功退出。 如果一个或多个库未知, pkg-config 会以非零代码退出, stdout 的内容未定义。 |
--help | 显示帮助信息并退出。 |
--print-errors | 如果命令行上的一个或多个模块, 或它们的依赖关系,没有找到, 或者在解析 .pc 文件时出现错误, 那么这个选项会导致打印出描述问题的错误。 例如 "--exists" 这样的 "断言" 选项, pkg-config 默认是静默的, 因为它通常用于脚本中, 这些脚本希望控制输出内容。 此选项可以单独使用 (仅打印查找命令行上的模块时遇到的错误) 或与其他选项一起使用。PKG_CONFIG_DEBUG_SPEW 环境变量 会覆盖此选项。 |
--silence-errors | 如果命令行上的一个或多个模块, 或它们的依赖关系,没有找到, 或者在解析 .pc 文件时出现错误, 那么此选项将阻止打印描述问题的错误。 例如 "--exists" 这样的 "断言" 选项, pkg-config 默认是静默的, 因为它通常用于脚本中, 这些脚本希望控制输出内容。 所以,此选项仅对默认打印错误的选项 (如 "--cflags" 或 "--modversion")有用。PKG_CONFIG_DEBUG_SPEW 环境变量会覆盖此选项。 |
--errors-to-stdout | 如果打印错误, 将它们打印到 stdout 而不是默认的 stderr。 |
--cflags | 此命令打印出编译命令行上的包 所需的预处理器和编译标志, 包括所有它们的依赖关系的标志。 标志是 "压缩" 的, 这意味着每个相同的标志只出现一次。 如果 pkg-config 无法找到命令行上的一个 或多个包的元数据,它会退出并返回非零代码。 |
--libs | 此选项与 "--cflags" 相同, 只是它打印链接标志。与 "--cflags" 一样, 重复的标志被合并(保持适当的顺序), 并且依赖关系的标志包含在输出中。 |
--libs-only-L | 这将打印 "--libs" 的 -L/-R 部分。也就是说, 它定义了库搜索路径,但并未指定要与之链接的库。 |
--libs-only-l | 这将为命令行上指定的库打印 "--libs" 的 -l 部分。 注意,"--libs-only-l" 和 "--libs-only-L" 的并集可能小于 "--libs", 这是由于像 -rdynamic 这样的标志。 |
--variable=VARIABLENAME | 这将返回在包的 .pc 文件中定义的变量的值。 大多数包都定义了变量 "prefix", 例如,所以你可以这样说:$ pkg-config --variable=prefix glib-2.0 /usr/ |
--define-variable=VARIABLENAME=VARIABLEVALUE | 这为变量设置了一个全局值, 覆盖任何 .pc 文件中的值。 大多数包都定义了变量 "prefix",例如, 所以你可以这样说: $ pkg-config --print-errors --define-variable=prefix=/foo \ --variable=prefix glib-2.0 /foo |
--uninstalled | 通常,如果你请求包 "foo", 并且存在包 "foo-uninstalled", pkg-config 会优先选择 "-uninstalled" 变种。 这允许对未安装的包进行编译/链接。 如果你指定 "--uninstalled" 选项, pkg-config 会在使用任何 "-uninstalled" 包时 返回成功,并在其他情况下返回失败(false)。 (设置 "PKG_CONFIG_DISABLE_UNINSTALLED" 环境变量可以阻止 pkg-config 隐式选择 "-uninstalled" 包, 所以如果设置了该变量, 除非你在命令行上明确地传递了像 "foo-uninstalled" 这样的名称, 否则它们不会被使用。) |
--exists , --atleast-version=VERSION , --exact-version=VERSION , --max-version=VERSION | 这些选项测试命令行上的包或一系列包 是否已知于 pkg-config, 并可选地测试包的版本号是否满足某些约束。 如果所有的包都存在并满足指定的版本约束, pkg-config 会成功退出。 否则,它会失败退出。 你可以简单地在每个包名称后面给出版本约束, 而不是使用版本测试选项, 例如:$ pkg-config --exists ’glib-2.0 >= 1.3.4 libxml = 1.8.3’。 记住,如果你想要错误消息, 使用 --print-errors。 |
--msvc-syntax | 此选项仅在 Windows 上可用。 它使 pkg-config 输出 -l 和 -L 标志, 这些标志是 Microsoft Visual C++ 命令行编译器 cl 所识别的格式。具体来说, 它不是打印 -Lx:/some/path 而是打印 /libpath:x/some/path, 而不是打印 -lfoo 它打印 foo.lib。 注意,--libs 输出由链接器的标志组成, 并且应该放在 cl 命令行的 /link 开关之后。 |
--dont-define-prefix | 此选项仅在 Windows 上可用。 它阻止 pkg-config 自动尝试 覆盖每个 .pc 文件中的变量 "prefix" 的值。 |
--prefix-variable=PREFIX | 这个选项也只在 Windows 上可用。 它设置 pkg-config 自动设置的变量的名称, 如上所述。 |
--static | 输出适合静态链接的库。 这意味着在输出中包括任何私有库。 这依赖于 .pc 文件中的适当标记, 否则通常会输出过多的库。 |
5、使用示例
1)pkg-config 查询库信息
pkg-config --libs package-name
该命令用于查询特定软件包(package-name)的链接信息,包括库文件名和链接标志。这通常用于编译时指定所需的库。
2)pkg-config 查询包含头文件的信息
pkg-config --cflags package-name
该命令用于查询特定软件包(package-name)的包含头文件的信息,包括头文件路径和编译标志。这通常用于编译时指定所需的头文件路径。
3)pkg-config 查询所有信息
pkg-config --libs --cflags package-name
该命令同时查询链接信息和包含头文件的信息,以便一次性获取所有所需的信息。
4)pkg-config 查询软件包版本
pkg-config --modversion package-name
该命令用于查询特定软件包(package-name)的版本号信息。
5)pkg-config 列出已安装的软件包
pkg-config --list-all
该命令列出系统上已安装的所有软件包及其对应的包名。
6)pkg-config 查询软件包的描述
pkg-config --description package-name
该命令用于查询特定软件包(package-name)的描述信息。
7)pkg-config 查询软件包的静态库信息
pkg-config --static --libs package-name
如果需要链接静态版本的库,可以使用此命令来获取静态库信息。
8)pkg-config 查询多个软件包的信息
pkg-config --libs package1 package2