2

更新:最初の問題は解決され、2 番目の問題はこの投稿の下部に記載されています。

UPDATE2: 2 番目の問題も解決されました。

非常に単純な GTK+2 C アプリケーション用の GNU ビルド ツール (autoconf/automake) のセットアップについて学習しようとしています。このチュートリアルとサブディレクトリを扱うこのチュートリアルに従いましたが、親ディレクトリの Makefile が生成されているにもかかわらず、ソース ディレクトリ (src サブディレクトリ内) が Makefile を生成しないという問題が発生しています。

まず、私のフォルダ構造は次のとおりです。

app/src
  - main.c
  - main.h
  - Makefile.am
app
  - configure.ac
  - Makefile.am
  - aclocal.m4
  (... other generated files ...)

重要なファイルの内容は次のとおりです。

app/configure.ac:

AC_PREREQ([2.63])
AC_INIT(app, 0.1)
AM_INIT_AUTOMAKE(app, 0.1)
AC_CONFIG_SRCDIR([src/main.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CONFIG_FILES([Makefile], [src/Makefile])
AC_OUTPUT

app/Makefile.am:

SUBDIRS = src

app/src/Makefile.am:

bin_PROGRAMS = app

app_SOURCES = main.c
app_LDADD = `pkg-config --cflags --libs gtk+-2.0`

次のコマンドを実行すると、次のようになります。

$ autoconf
$ automake -a
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... none
configure: creating ./config.status
config.status: creating Makefile
./config.status: line 1153: src/Makefile: No such file or directory
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

チェックすると、アプリのメイン フォルダーには Makefile と Makefile.in が含まれていますが、src フォルダーには Makefile.am しかありません。何か案は?

更新: adl で言及されている変更を行いました。つまり、AC_CONFIG_FILES コマンドから角かっことコンマを削除し、AM_INIT_AUTOMAKE コマンドからアプリ名/バージョンを削除しました。また、src/Makefile.am の app_LDADD コマンドを app_LDFLAGS に変更しました。これにより、configure を通過できないという最初の問題は修正されましたが、現在は gtk ライブラリを探していません。make を実行すると、次のような結果が得られます。

$ make
make  all-recursive
make[1]: Entering directory `/home/adam/Development/app-0.1'
Making all in src
make[2]: Entering directory `/home/adam/Development/app-0.1/src'
if gcc -DHAVE_CONFIG_H -I. -I. -I..     -g -O2 -MT main.o -MD -MP -MF ".deps/main.Tpo" \
      -c -o main.o `test -f 'main.c' || echo './'`main.c; \
    then mv -f ".deps/main.Tpo" ".deps/main.Po"; \
    else rm -f ".deps/main.Tpo"; exit 1; \
    fi
main.c:3:21: error: gtk/gtk.h: No such file or directory
In file included from main.c:4:
main.h:4: error: expected specifier-qualifier-list before ‘GtkWidget’

pkg-config で得られるものは次のとおりです。

$ pkg-config --libs --cflags gtk+-2.0
-D_REENTRANT -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0

src/Makefile.am で何か間違ったことをしていると確信していますが、何が原因かわかりません。それが役立つ場合、私の構成スクリプトは gtk ライブラリを探していないようです。

更新 2:

したがって、update1 の問題の基本的な解決策は、configure.ac ファイルに次のチェックを追加する必要があるようです。

PKG_CHECK_MODULES(GTK, [gtk+-2.0 >= 2.12])

PACKAGE_CFLAGS="-g -Wall $GTK_CFLAGS"
PACKAGE_LIBS="-g $GTK_LIBS"
PACKAGE_LDFLAGS="-export-dynamic $GTK_LDFLAGS"

AC_SUBST([PACKAGE_CFLAGS])
AC_SUBST([PACKAGE_LIBS])
AC_SUBST([PACKAGE_LDFLAGS])

これは、AC_PROG_CC の下のプログラム セクションのチェックに追加されます。これが行うことは、gtk+-2.0 ライブラリをチェックするよう configure に指示することです。大文字の GTK は任意の変数名のようで、CFLAGS、LIBS、および LDFLAGS (およびおそらくそれ以上) が動的に追加されるため、PACKAGE_* 変数を生成できます。AC_SUBST は Makefile.am の PACKAGE* 変数にアクセスできるようにするようです。参考までに、-export-dynamic フラグが追加されて、glade/gtkbuilder ファイルを使用できるようになりました (他にも理由があると思いますが、私はまだ非常に基本的なレベルの理解に留まっています)。

src/Makefile.am には、次のものが必要です。

bin_PROGRAMS = app

app_SOURCES = main.c main.h 
app_LDADD = @PACKAGE_LIBS@
app_LDFLAGS = @PACKAGE_LDFLAGS@
INCLUDES = @PACKAGE_CFLAGS@

これは、基本的な gtk+-2.0 C アプリに必要なすべてのようです。autotools を使用する C gtk アプリをセットアップするための簡単なチュートリアルを書くきっかけになりました。この分野では、最近の初心者向けのドキュメント/情報が明らかに不足しています。

4

4 に答える 4

2

ファイルに 2 つの問題がありconfigure.acます。まず、AM_INIT_AUTOMAKE呼び出しの構文は 10 年前のものです。非常に古いチュートリアルからコピーしたのではないかと思います (ヒント: Automake マニュアルにはチュートリアル的な紹介があります)。パッケージとバージョンは にすでに渡されています。AC_INITで繰り返す必要はありませんAM_INIT_AUTOMAKE。次に、 に渡されるファイルのリストは、AC_CONFIG_OUTPUT最初の引数として指定されたスペース区切りのリストでなければなりません。

言い換えれば、あなたは次のconfigure.acように見えるはずです

AC_PREREQ([2.63])
AC_INIT([app], [0.1], [your@email])
AM_INIT_AUTOMAKE([-Wall])
AC_CONFIG_SRCDIR([src/main.h])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT

行にコマがないことに注意してくださいAC_CONFIG_FILES

この-Wallオプションによりautomake、より多くの警告が出力されます (これは実際にはautomakeオプションであり、オプションではありませんgcc)。これらのツールを見つけた方がおそらく安全です。

これでconfigure問題が解決するはずです。app_LDADD次に、おそらく行をapp_CPPFLAGSandに分割する必要があると思いますapp_LDFLAGS

于 2009-07-05T01:09:02.477 に答える
1

まだ言及されていないいくつかの問題:

  • およびautoreconfを (再) 生成するために使用します。必要なツールを正しい順序で呼び出します。configureMakefile.in
  • Makefile では、Autoconf 置換 (" ") よりもmakeマクロ (" ")を使用することをお勧めします。前者の利点は、必要に応じてオーバーライドできることです。$(FOO)@FOO@make
  • configureソース ディレクトリでビルドするのではなく、別のビルド ディレクトリを作成してそこで実行することをお勧めします。これは、おそらく壊したくない設定です。また、テストしていない場合は、うっかり壊してしまう可能性があります。
于 2009-07-07T19:13:17.213 に答える
0

GTK_CFLAGS と GTK_LDFLAGS を PACKAGE_CFLAGS に追加する代わりに、次のように簡単に実行できます。

app_LDADD = @PACKAGE_LIBS@ @GTK_LIBS@

または、すべてのアプリが gtk に依存している場合は、

LDADD = @GTK_LIBS@

-g と -Wall をそのまま指定するのは、あまり良いことではありません。AM_CFLAGS を定義することで、より簡単に実行できます。-Wall では問題ありませんが、実際には -g は必要ありません。デフォルトの configure は CFLAGS に -g を追加します。configure の実行時にユーザーが CFLAGS をオーバーライドする場合は、ユーザーが何をしているのかを知っていると信頼し、-g をスキップする自由を与える必要があります。便宜上 -g を追加する場合 (つまり、構成時に CFLAGS を指定するときに -g を指定する必要はありません)、プロジェクトのビルド ファイルに -g をハードコーディングするよりも、CONFIG_SITE を使用する方が適切です。 .

于 2009-07-22T10:18:19.510 に答える
-1

このための別のオプションは次のとおりです。

AM_PATH_GTK_2_0([Min version], [Succes], [Failure])
AM_PATH_GLIB_2_0([Min version], [Succes], [Failure])

マクロの可能性として、aclocal ディレクトリ (/usr/aclocal) に何が保持されているかを確認することを常にお勧めします。また、必要な M4 マクロが aclocal.m4 にコピーされるように、aclocal を実行することも忘れないでください。

于 2009-10-01T20:43:30.273 に答える