PKG_CONFIG_PATH环境变量


74

如果您以非标准前缀安装软件,请考虑调整PKG_CONFIG_PATH环境变量。这是什么意思 ?


1
我几乎会以同样的方式问这个问题,除了您可能会问过有关如何正确使用PKG_CONFIG_PATH环境变量的示例,例如“它是什么以及如何使用它?”。看来您得到的答案试图告诉您这一点。我发现它在./configure期间无法找到依赖项时显示很多。
Douglas G. Allen

Answers:


68

PKG_CONFIG_PATH是一个环境变量,它指定pkg-config将在其中搜索其.pc文件的其他路径。

此变量用于扩展pkg-config的默认搜索路径。在典型的Unix系统上,它将在目录/usr/lib/pkgconfig和中搜索/usr/share/pkgconfig。这通常将涵盖系统安装的模块。但是,某些本地模块可能以不同的前缀安装,例如/usr/local。在这种情况下,必须在搜索路径前添加前缀,以便pkg-config可以找到.pc文件。

pkg-config程序用于检索有关系统中已安装的库的信息。的主要用途pkg-config是为编译程序并将其链接到库提供必要的详细信息。此元数据存储在pkg-config文件中。这些文件的后缀为.pc,位于pkg-config工具已知的特定位置。

要检查该PKG_CONFIG_PATH值,请使用以下命令:

echo $PKG_CONFIG_PATH

要设置PKG_CONFIG_PATH值,请使用:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

要么

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd感谢您的提醒,评论已删除。最初的错误似乎是由非原创作者编辑引起的。
蒂莫西·古

@remram似乎错误已得到解决,但是如果您的评论不正确地查看编辑历史记录,则会使人们感到困惑。您能否对当前的准确性感到满意,然后删除评论?(我将删除我的。)
内森·基德

@ devav2两个出口的命令不解决这个问题
傻眼了

38

第一个答案在技术上还不够明确。在手册页中(打开终端,输入man pkg-config):

pkg-config从特殊的元数据文件中检索有关程序包的信息。这些文件以软件包命名,并具有.pc扩展名。在大多数系统中, pkg-config 看起来/usr/lib/pkgconfig/usr/share/pkgconfig/usr/local/lib/pkgconfig并且/usr/local/share/pkgconfig这些文件。此外,它将在PKG_CONFIG_PATH环境变量指定的目录列表中以冒号分隔(在Windows中,以分号分隔)中查找。

因此该pkg-config程序不在PKG_CONFIG_PATH目录中。但是,如果安装了一个库,则要知道automake要在脚本中使用它的信息以使其可访问,就需要pkg-config知道该目录中。


关键字似乎是“在大多数系统上”。例如,在我的Debian上,我们/usr/local/lib/x86_64-linux-gnu被免费作为自动搜索位置(带有空PKG_CONFIG_PATH),并且确实有很多.pc文件-值得注意的是GTK +等。- 住在那里。原因是要同时启用一个程序包的多体系结构可用性,如下所述:askubuntu.com/questions/449348/…–
underscore_d

(无法再编辑)@GrandAdmiral在此页面下方的答案中显示了如何检查pkg-config将在您的系统上搜索的默认路径:askubuntu.com/a/373217/436580
underscore_d

35

要查看默认情况下pkg-config(0.24版或更高版本)在哪里搜索已安装的库,请使用以下命令:

pkg-config --variable pc_path pkg-config

要修改该路径,请设置PKG_CONFIG_PATH环境变量。man文件状态PKG_CONFIG_PATH为:

用冒号分隔(在Windows中,用分号分隔)的目录列表,以搜索.pc文件。搜索路径后,始终会搜索默认目录。默认值为libdir / pkgconfig:datadir / pkgconfig,其中libdir是libdir,其中pkg-config,datadir是安装pkg-config的datadir。


3
一个有用的脚本是echo $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan'3

5
这是一个很好的答案,帮助了我。但是,为了澄清起见,您应该说“添加到该路径”,而不是“修改”,因为一个可以有一个空白PKG_CONFIG_PATH,但仍然具有默认的搜索目录,另外设置一个非空白值不会清除默认值。
underscore_d

这个答案对我来说真的很有用,谢谢!我试图弄清楚pkg-config的默认搜索路径是什么,因为我的随Linuxbrew一起安装,所以默认路径不存在。谢谢!
mxplusb

6

您正在尝试构建软件,比方说Widget。窗口小部件依赖于另一个库libcog以作为参数。窗口小部件的构建过程(可能是配置脚本)正在使用pkg-config确定如何使用libcog。pkg-config对libcog一无所知。

如果未安装libcog,那就是您的问题。标准安装libcog很有可能会解决该问题。根据您的系统,您可能需要安装该软件包的其他“开发人员”版本。它的末尾通常带有“ -devel”或“ -dev”,因此,如果安装“ libcog”,则可能还需要安装“ libcog-devel”。

如果安装了libcog,则可能不是以pkg-config可以找到它的方式安装的。您的系统上可能有一个libcog.pc文件。为了便于讨论,它位于/opt/cog/lib/pkgconfig/libcog.pc。在这种情况下,可以通过将PKG_CONFIG_PATH设置到保存libcog.pc的目录来告知pkg-config。因此,在伯恩贝壳或类似的东西中

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/cog/lib/pkgconfig/

完成后,重新运行失败的命令有望成功。

如果安装了libcog(包括库和头文件),并且您没有libcog.pc文件,那么情况会很糟糕。大概是标准安装的libcog包含了该信息,否则Widget不会依赖它。我首先要研究重新安装libcog。可以手动创建libcog.pc文件,但是正确处理它是困难的,并且高度特定于给定的库。


4
但是,有一件事-如果定义了PKG_CONFIG_PATH怎么办-这将正确覆盖它吗?
2015年

1
@NoBugs很好,我已经编辑了答案(数年后!)以附加它。
乔·马尔

5

我查看了64位系统上的手册页,感到有些困惑。它说了一行:

pkg-config从特殊的元数据文件中检索有关软件包的信息。这些文件以软件包名称命名,扩展名为.pc。缺省情况下,pkg-config在目录前缀/ lib / pkgconfig中查找这些文件;它也会在由PKG_CONFIG_PATH环境变量指定的目录中以冒号分隔(在Windows中,以分号分隔)中查找。

我以为它总是在目录lib / pkgconfig中。证明其目录本身。就我而言,我正在尝试编译hello world gtk教程。我找到我想要的文件,例如

locate gtk | grep '\.pc'

结果包括:

/usr/lib/x86_64-linux-gnu/pkgconfig/gtk+-3.0.pc

最后是做出口。

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/

1
+1指出man页面如何简化现代的,具有多体系结构的系统。我有些困惑,因为在Debian 8 x86上,它pkg-config已经在x86_64文件夹中查找了(中没有任何内容PKG_CONFIG_PATH)。我不确定这是如何合并的,但是通过@GrandAdmiral显示的用于探测此问题的命令行表明它是由--variable pc_pathpkg-config自己的包设置的(以某种方式!)控制的。
underscore_d

5

在我看来,大多数答案所提供的信息过多而已。

一个安装的软件可能(并且通常确实)依赖某些库和/或头文件,并且系统使用pkg-config查找它们。

这样说,pkg-config在预定义(默认)系统的目录中查找此文件。这些文件夹是“前缀”。例如,具有前缀的库/usr/local应在中包含标头/usr/local/include,而库本身将在中/usr/local/lib。 但是pkg-config也在环境变量PKG_CONFIG_PATH中列出的目录中查找库。

然后,如果您在默认文件夹列表之外安装软件,则必须“调整”列表,即将目录添加到PKG_CONFIG_PATH

$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:<your-directory>

有关更多信息,您可以在这里这里查看


PKG_CONFIG_PATH指定 在其中搜索yourPkg.pcpkg-config规范)文件的其他目录。它不会影响特定于pkg的内容,例如库搜索目录。
underscore_d

1

这意味着您正在尝试从源代码构建某些内容,并且找不到所需的所有依赖项。pkg-config它用于查找那些库的开发文件的脚本,输出此消息。


0

我试图安装最新版本的axel,然后运行./configure并得到了以下信息:

configure: error: Package requirements (openssl) were not met:

No package 'openssl' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SSL_CFLAGS
and SSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

所以我尝试了:

$ pkg-config --cflags openssl

我得到:

Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'openssl' found

很明显,我已经安装了openssl(sudo apt-get install openssl),但是在上面的输出中,您看到的是“未找到包'openssl'”。因此,请确保我这样做:

find / -type f -name "*.pc" |& grep -iv permission | grep openssl

原来我肯定需要其他软件包,所以经过一番谷歌搜索后发现我必须安装此软件包:

sudo apt-get install libssl-dev

所有这些都与更改pkg-config path env变量无关。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.