我尝试从源代码编译atk 2.7.91。由于我正在使用较旧的ubuntu系统,因此没有最新的所需glib版本的软件包。所以我刚刚下载了glib 2.35.8并成功./configure
和make
(我不想在系统范围内安装它,所以我没有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/:'
知道这里有什么问题以及如何解决它?
答案 0 :(得分:3)
至于(几乎)手册总是你的朋友。试着看看man pkg-config
你会发现它是pkg-config需要执行它的.pc
个文件。在你的情况下glib-2.0.pc
。不幸的是,它并不像指向存储它的位置那么容易,但最后要留下长的答案并暂时查看手册页。
pkg-config从special检索有关包的信息 元数据文件。这些文件以包的名字命名,并且有一个 .pc扩展名。在大多数系统上,pkg-config可以查找和查找这些内容 文件。它还会以冒号分隔(在Windows上, 以分号分隔的目录列表 PKG_CONFIG_PATH环境变量。
pkg-config命令行中指定的包名称是 定义为元数据文件的名称,减去.pc扩展名。 如果库可以同时安装多个版本,则必须安装 给每个版本自己的名字(例如,GTK 1.2可能有 包名“gtk +”而GTK 2.0有“gtk + -2.0”。
我希望你找到了有趣的
在大多数系统上,pkg-config查找并查找这些文件
线。你的系统的结果可能会有所不同,但在我的系统中,它实际上会以这种方式显示,这很可能是一个错误。
然而,您可以通过运行找出已编译的标准目录
pkg-config --variable pc_path pkg-config
例如打印
/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
个文件。
至少如果库本身不包含任何硬连线的pathes,但这只是运行时的问题而不是链接时。
甚至可以解决最后一个难题 - .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
个占位符。即@prefix@
填充了命令行中以--prefix=
给出的参数,而@NTLLIBS@
之类的其他参数则填充了配置脚本检测到的参数。
答案 1 :(得分:2)
你需要在某处安装glib,你不能只在Glib构建目录中指向ATK。您可以将它安装在私人的地方,如〜/ install by
./configure --prefix=/home/<username>/install
(configure不喜欢~IIRC)