Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux pkg-config 命令。

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