我有几个使用automake构建的项目(让我们称之为lib1和lib2). lib2依赖于lib1作为库,我在CentOS上遇到pkg-config默认值的问题.理想情况下,我希望用户不必设置任何环境变量来正确安装所有内容.
现在,它只是假设${PREFIX} / lib / pkgconfig作为我的.pc文件的目的地,但在CentOS 7上,${PREFIX}的默认值是/usr/local,但pkgconfig默认只查看/usr/share / pkgconfig和/usr/lib64 / pkgconfig.因此,lib2无法找到带有pkg-config的lib1,并且配置脚本会爆炸.
所以,问题是,我的lib1中的“make install”如何正确检测安装pkg-config文件的目录?
来自man pkg-config
PKG_INSTALLDIR(DIRECTORY)
Substitutes the variable pkgconfigdir as the location where a module should install pkg-config .pc files. By default the
directory is $libdir/pkgconfig, but the default can be changed by passing DIRECTORY. The user can override through the
--with-pkgconfigdir parameter.
这允许您将pkg-config文件的install-directory公开给用户(并且 – 如果您的发行版修补了pkg-config以使用非标准搜索路径,则希望为您的系统选择正确的默认值).
例:
configure.ac:
[...]
PKG_INSTALLDIR
[...]
Makefile.am:
[...]
pkgconfig_DATA = lib1.pc
[...]
用法
$./configure --prefix=/usr --with-pkgconfigdir=/usr/lib64/pkgconfig
注意
请不要对pkg-config查找文件的位置做出特定于发行版的假设.
始终使用默认值(出于正当理由它们是默认值),并提供一种方法来覆盖非标准系统的这些默认值.
那里有很多分布,只是因为在我的社区中有一个流行,这并不意味着其他社区(或不会改变)也是如此.
如果您的发行版不符合标准,那么它应该是一致的;如果它不能保持一致(例如pkg-config在/ foo / baz中查找文件,但PKG_INSTALLDIR将pkgconfigdir扩展到/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
$