0

ソースからatk2.7.91をコンパイルしようとしました。私は古いubuntuシステムで作業しているので、必要なglibバージョンの最近のパッケージはありません。だから私はglib2.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

簡潔な答え

(ほぼ) いつものように、マニュアルはあなたの味方です。pkg-config がジョブを実行するために必要なファイルであることman pkg-configがわかります。あなたの場合。残念ながら、それが保存されている場所を指すだけでは簡単ではありませんが、最後に長い答えを残して、最初にしばらくの間マニュアルページを見てください..pcglib-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たとえば、印刷します

/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。つまり、コマンドラインで指定され@prefix@た引数が入力されていましたが、configure スクリプトによって検出されたパラメーターが入力されていました。--prefix=@NTLLIBS@

于 2013-02-21T21:39:56.647 に答える
2

glibをどこかにインストールする必要があります。ATKをGlibビルドディレクトリに向けるだけでは不十分です。〜/installbyのようにプライベートな場所にインストールできます

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

(構成は〜IIRCが好きではありません)

于 2013-02-21T18:42:09.620 に答える