使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径

Posted

技术标签:

【中文标题】使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径【英文标题】:Installing pkg-config files to proper path on CentOS with automake 【发布时间】:2015-05-13 21:24:20 【问题描述】:

我维护了几个使用 automake 构建的项目(我们称它们为 lib1 和 lib2)。 lib2 依赖于 lib1 作为库,而我在 CentOS 上的 pkg-config 默认值存在一些问题。理想情况下,我希望用户不必设置任何环境变量即可正确安装所有内容。

现在,它只是假设 $PREFIX/lib/pkgconfig 作为我的 .pc 文件的目的地,但在 CentOS 7 上,$PREFIX 的默认值为 /usr/local 但默认情况下 pkgconfig 仅在 /usr/share/pkgconfig 和 @ 中查找987654328@。因此,lib2 无法找到 lib1pkg-config,并且配置脚本崩溃了。

那么,问题来了,我在lib1中的make install如何正确检测到安装pkg-config文件的目录?

【问题讨论】:

考虑将搜索目录添加到PKG_CONFIG_PATH 环境变量。 man pkg-config 有更多关于 env-vars 的详细信息。 效果很好。但是,我一直在寻找一种解决方案,以便通用平台(例如 RHEL/CentOS)使用它们的默认配置! 所以您想要基于configure.ac 中的PKG_CHECK_MODULES 宏的解决方案?如果目录没有内置到 pkg-config 的搜索路径中,您将需要在 somewhere 中设置搜索目录。 真正的问题不是在哪里搜索 pacakges,而是在哪里安装 .pc 文件。更像是一个宏来确定 pkgconfig 想要它的 pc 文件去哪里,因为在这种情况下 $prefix/lib/pkgconfig 似乎是错误的。 confg.site 控制在何处查找内容,例如基于 Red Hat 的系统上的 lib64 库目录。 Fedora 也遇到了这个问题。另见config.site for vendor libs on Fedora x86_64。 【参考方案1】:

来自man pkg-config

PKG_INSTALLDIR(目录)

将变量 pkgconfigdir 替换为模块应安装 pkg-config .pc 文件的位置。默认情况下 目录是 $libdir/pkgconfig,但可以通过传递 DIRECTORY 来更改默认值。用户可以通过 --with-pkgconfigdir参数。

这允许您向用户公开 pkg-config 文件的安装目录(并且 - 如果您的发行版修补了 pkg-config 以使用非标准搜索路径,它有望为您的系统选择正确的默认值) .

例子:

配置.ac:

[...]
PKG_INSTALLDIR
[...]

Makefile.am:

[...]
pkgconfig_DATA = lib1.pc
[...]

用法

$ ./configure --prefix=/usr --with-pkgconfigdir=/usr/lib64/pkgconfig

注意

请不要对 pkg-config 查找文件的位置做出特定于发行版的假设。 始终使用默认值(它们是有充分理由的默认值),并为非标准系统提供覆盖这些默认值的方法。

那里有很多发行版,仅仅因为在我的社区中流行,这并不意味着其他社区也是如此(或不会改变)。

如果您的发行版不遵循标准也没关系,但应该保持一致;如果它不能保持一致(例如,pkg-config/foo/baz 中查找文件,但 PKG_INSTALLDIRpkgconfigdir 扩展为 /usr/lib/pkg-config),那么您应该在您的发行版中报告一个错误。

我也觉得很奇怪,你的pkg-config 不会在/usr/local 中搜索文件。 例如。在我的 Debian/sid 系统上,它首先搜索/usr/local,然后搜索/usr

$ which pkg-config
/usr/bin/pkg-config

$ strace -e trace=open pkg-config --cflags foo 2>&1  | grep /usr
open("/usr/local/lib/x86_64-linux-gnu/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/share/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("/usr/lib/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
open("/usr/share/pkgconfig", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
$

【讨论】:

以上是关于使用 automake 在 CentOS 上将 pkg-config 文件安装到正确的路径的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CentOS 上将 Python3.5.2 设置为默认 Python 版本?

如何在 centos 上将 subversion(svn) 1.6.11 版本升级到 1.8.5 版本?

在 CentOS 上将 PHP 5.3 更新到 PHP 5.5 后,我无法访问 phpmyadmin

如何在 centos 上将 dotnetcore 从 1.0.4 版本升级到 2.0.2 版本?

如何在 Centos 7 上将 php 从 cgi-fcg 更改为 php cli

如何在CentOS 6.7上将PHP 5.3升级到PHP 5.6