0

我试图从源代码编译 atk 2.7.91。由于我正在使用较旧的 ubuntu 系统,因此没有所需的 glib 版本的最新软件包。所以我刚刚下载了 glib 2.35.8 并成功完成./configuremake它(我不想在系统范围内安装它,所以我没有这样做make install)。

假设这个 glib 在/foobar/glib-2.35.8. 现在我cd/foobar/atk-2.7.91导出PKG_CONFIG_PATH: export PKG_CONFIG_PATH=/foobar/glib-2.35.8:$PKG_CONFIG_PATH

然后

pkg-config --modversion glib-2.0

告诉我:

2.35.8

但是当我这样做时,./configure我收到错误消息:

checking for GLIB - version >= 2.31.2... no
*** Could not run GLIB test program, checking why...
*** The test program failed to compile or link. See the file config.log for the
*** exact error that occured. This usually means GLIB is incorrectly installed.
configure: error: 
*** GLIB 2.31.2 or better is required. The latest version of
*** GLIB is always available from ftp://ftp.gtk.org/. If GLIB is installed
*** but not in the same location as pkg-config add the location of the file
*** glib-2.0.pc to the environment variable PKG_CONFIG_PATH.

cat config.log |grep glib给出:

configure:12143: checking for GLIB - version >= 2.31.2
configure:12258: gcc -o conftest -g -O2 -Wall -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include    -DG_DISABLE_SINGLE_INCLUDES -DATK_DISABLE_SINGLE_INCLUDES  conftest.c -L/usr/local/lib -lgobject-2.0 -lglib-2.0    >&5
conftest.c:25:18: fatal error: glib.h: No such file or directory
| #include <glib.h>
|   fclose (fopen ("conf.glibtest", "w"));
|   if ((glib_major_version != 2) ||
|       (glib_minor_version != 35) ||
|       (glib_micro_version != 8))
|       printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
|              glib_major_version, glib_minor_version, glib_micro_version);
|       printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
|   else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
|      (glib_minor_version != GLIB_MINOR_VERSION) ||
|            (glib_micro_version != GLIB_MICRO_VERSION))
|       printf("*** GLIB header files (version %d.%d.%d) do not match\n",
|        GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
|        glib_major_version, glib_minor_version, glib_micro_version);
|       if ((glib_major_version > major) ||
|         ((glib_major_version == major) && (glib_minor_version > minor)) ||
|         ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
|         printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n",
|                glib_major_version, glib_minor_version, glib_micro_version);
|         printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n",
|         printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
|         printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
configure:12304: gcc -o conftest -g -O2 -Wall -I/usr/local/include/glib-2.0 -I/usr/local/lib/glib-2.0/include    -DG_DISABLE_SINGLE_INCLUDES -DATK_DISABLE_SINGLE_INCLUDES  conftest.c  -L/usr/local/lib -lgobject-2.0 -lglib-2.0   >&5
conftest.c:25:18: fatal error: glib.h: No such file or directory
| #include <glib.h>
|  return ((glib_major_version) || (glib_minor_version) || (glib_micro_version));
*** GLIB 2.31.2 or better is required. The latest version of
*** GLIB is always available from ftp://ftp.gtk.org/. If GLIB is installed
*** glib-2.0.pc to the environment variable PKG_CONFIG_PATH.
ac_cv_env_PKG_CONFIG_PATH_value=/foobar/glib-2.35.8/:
GLIB_CFLAGS=''
GLIB_COMPILE_RESOURCES=''
GLIB_GENMARSHAL=''
GLIB_LIBS=''
GLIB_MKENUMS=''
GLIB_PACKAGES='gobject-2.0'
GLIB_REQUIRED_VERSION='2.31.2'
PKG_CONFIG_PATH='/foobar/glib-2.35.8/:'

知道这里出了什么问题以及如何解决吗?

4

2 回答 2

3

简短的回答

正如(几乎)始终手册是您的朋友。试着看看man pkg-config你会发现它.pc是 pkg-config 执行它的工作所需的文件。glib-2.0.pc在你的情况下。不幸的是,这并不像仅仅指向存储它的位置那么简单,而是把它留到最后,然后先看一下手册页。

pkg-config 从特殊元数据文件中检索有关包的信息。这些文件以包命名,并具有 .pc 扩展名。在大多数系统上,pkg-config 会查找这些文件。它还将查看由 PKG_CONFIG_PATH 环境变量指定的以冒号分隔(在 Windows 上以分号分隔)的目录列表。

pkg-config 命令行上指定的包名称被定义为元数据文件的名称,减去 .pc 扩展名。如果一个库可以同时安装多个版本,它必须给每个版本一个自己的名字(例如,GTK 1.2 可能有包名“gtk+”,而 GTK 2.0 有“gtk+-2.0”)。

我希望你觉得有趣

在大多数系统上,pkg-config 会查找并查找这些文件

线。结果可能在您的系统上有所不同,但在我的系统上它实际上以这种方式显示,这很可能是一个错误。

pkg-config --variable pc_path pkg-config不过,您可以通过运行which 例如 prints来找出标准目录中编译的 内容

/usr/local/lib/pkgconfig:/usr/local/lib/pkgconfig/i486-linux-gnu:/usr/local/share/pkgconfig:/usr/lib/pkgconfig:/usr/lib/pkgconfig/i486-linux-gnu:/usr/share/pkgconfig

在我的系统上。

长答案

回到你原来的问题,看看一个示例.pc文件可能最好地解释为什么你的第一次努力是徒劳的。作为示例,这里是glib-2.0.pc我系统上文件的内容:

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: 2.24.2
Libs: -L${libdir} -lglib-2.0 
Libs.private: 
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include 

正如您希望看到的那样,整个路径都是硬连线的。不要被${libdir}……之类的东西弄糊涂了。仔细观察,您会发现它们都是从prefix=/usr第一行构建的。

试图将 PKG_CONFIG_PATH 指向 glib 的构建目录的原因将无法作为.pc安装目录中指定的路径而不是构建目录的位置。

这就是您的pkg-config --modversion测试运行良好的原因:.pc确实找到了该文件并包含给定的信息,但编译失败:.pc在第一种情况下找到了该文件,但文件中给出的路径.pc完全错误。

没有人可以禁止您仅将 中给定的目录更改为.pc您喜欢的任何路径,因此实际上您可以通过手动修复.pc文件中给定的路径来使新构建的库在其构建目录中工作。至少如果库本身不包含任何硬连线路径,但这只会在运行时成为问题,而不是在链接时。

甚至解决最后一个难题 -.pc文件怎么会知道它将被安装到哪里来给出正确的前缀?只需查看您的源目录即可。伴随您的glib-2.0.pc文件,您会找到一个名为glib-2.0.pc.in那里的文件,其内容如下所示:

prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: @VERSION@
Requires.private: @PCRE_REQUIRES@
Libs: -L${libdir} -lglib-2.0 @INTLLIBS@
Libs.private: @G_THREAD_LIBS@ @G_LIBS_EXTRA@ @PCRE_LIBS@ @INTLLIBS@ @ICONV_LIBS@
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include @GLIB_EXTRA_CFLAGS@

@....@运行时在配置时填写的整个占位符configure。ie@prefix@填充--prefix=了命令行中给出的参数,而其他类似@NTLLIBS@填充了配置脚本检测到的参数。

于 2013-02-21T21:39:56.647 回答
2

您需要在某处安装 glib,不能只将 ATK 指向 Glib 构建目录。您可以将它安装在像 ~/install 这样的私有位置

./configure --prefix=/home/<username>/install

(配置不喜欢~IIRC)

于 2013-02-21T18:42:09.620 回答