2009-07-04 5 views
2

更新日:最初の問題は解決され、2番目はこの記事の最後に記載されています。非常にシンプルなgtk2 cアプリで、gnuビルドツールの設定に問題があります

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

私は非常に単純なGTK + 2 CアプリケーションのためにGNUビルドツール(autoconf/automake)を設定する方法を学びたいと思っています。私はthis tutorialthis one that deals with sub directoriesを追跡しましたが、親ディレクトリのMakefileが生成されているにもかかわらず、私のソースディレクトリ(srcサブディレクトリ内)がMakefileを生成していないという問題が発生しています。

まず、ここに私のフォルダ構造である:ここで

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

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

アプリ/ 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 

アプリ/ Makefile.am :

SUBDIRS = src 

アプリ/の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しかありません。何か案は?

UPDATE: IはADL言及変更を行い、すなわち、IはAC_CONFIG_FILESコマンドから角括弧とコンマを除去しAM_INIT_AUTOMAKEコマンドからアプリ名/バージョンを除去します。 src/Makefile.amのapp_LDADDコマンドをapp_LDFLAGSに変更しました。これはconfigureを経由しないという私の最初の問題を解決しましたが、今はgtkライブラリを探していません。私はメイクを行うと、私は次のような何かを得る:ここで

$ 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、しかし私は何がわからない。役に立った場合、configureスクリプトはgtkライブラリを探しているようには見えません。

アップデート2:

ので、アップデート1での問題のための基本的な解決策は、私は私の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の下にあります。これはconfigureがgtk + -2.0ライブラリをチェックするように指示します。大文字のGTKは任意の変数名のように見え、CFLAGS、LIBS、LDFLAGS(そしてもっと多分)が動的に追加されるので、PACKAGE_ *変数を生成することができます。 AC_SUBSTはMakefile.amのPACKAGE *変数にアクセスできるようにしているようです。参考までに、glade/gtkbuilderファイルを使用できるように-export-dynamicフラグが追加されています(他の理由もあると確信していますが、依然として非常に基本的なレベルです)。

のsrc/Makefile.amでは、あなたが持っている必要があります。

bin_PROGRAMS = app 

app_SOURCES = main.c main.h 
app_LDADD = @[email protected] 
app_LDFLAGS = @[email protected] 
INCLUDES = @[email protected] 

これはあなたが基本的なGTK + -2.0 Cアプリに必要なすべてのことのようです。実際には、autotoolsを使用するC gtkアプリケーションを設定するための簡単なチュートリアルを書いてくれました。この分野には、最近の初心者のドキュメント/情報が明確に欠けています。

答えて

2

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

は、あなたのconfigure.acAC_CONFIG_FILESラインには、コマ収差がない

AC_PREREQ([2.63]) 
AC_INIT([app], [0.1], [[email protected]]) 
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 

ノートのようになります。あなたはこれらのツールを発見した場合

-Wallオプション出力にautomakeの原因になりますよりの警告(これは本当にautomakeオプション、ないgccオプションです)、それはおそらく安全です。

これはあなたのconfigure問題を修正するはずです。次に、app_LDADD行をapp_CPPFLAGSapp_LDFLAGSに分割する必要があると思われます。まだ言及されていない

+0

あなたの答えをありがとう!それが私の最初の問題を解決しましたが、それは私のポストの最後に言及された2番目の問題を明らかにしました。 –

+0

2番目の問題の解決策を投稿しました。 –

+0

Makefile.amでINCLUDESを使用しないでください。これは廃止予定の変数です。代わりにAM_CPPFLAGSまたはapp_CPPFLAGSを使用してください。 (私が言ったように-Wallを使用すると、これについて警告する必要があります) "x = y; AC_SUBST([x])"の代わりに "AC_SUBST([x]、[y])"と書くこともできます。 – adl

1

さらにいくつかの問題:

  • 使用autoreconf生成configureMakefile.in(再)へ。必要なツールを正しい順序で呼び出します。
  • あなたのメイクファイルでAutoconfの置換(“ @[email protected] ”)にmakeマクロ(“ $(FOO) ”)を使用して好みます。前者の利点は、それが必要な場合にはmakeにオーバーライドできることです。
  • 別のビルドディレクトリを作成し、ソースディレクトリにビルドする代わりにconfigureを実行することをお勧めします。これはおそらく中断したくない設定です。テストしていない場合は、誤って破損する可能性があります。
0

よりもむしろあなたのパッケージに_ CFLAGSをGTK _ CFLAGSとGTK _ LDFLAGSを追加するには、単に行うことができます。

 
app_LDADD = @PACKAGE_[email protected] @GTK_[email protected] 

または、すべてのアプリは、GTKに依存する場合、単に

 
LDADD = @GTK_[email protected] 
を行うと

-gと-Wallを指定すると、実際には良いことではありません。 AM _ CFLAGSを定義することでより簡単に行うことができますが、-Wallの場合はこれで問題ありませんが、実際には-gは必要ありません。デフォルトのconfigureでは-gがCFLAGSに追加され、configureが実行されているときにCFLAGSを上書きする場合は、ユーザが何をしているのかを知り、-gをスキップできるようにする必要があります。独自の利便性のために-gを追加する場合(設定時にCFLAGSを指定するときに-gを指定する必要がないため)、プロジェクトの-gをハードコーディングするのではなく、CONFIG _ SITEを使用する方が適切ですビルドファイル。

-1

このため別のオプションは、次のことができます:

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

それはあなたのaclocalディレクトリ(は/ usr/aclocalの)マクロの可能性として保持しているものを見てみることを常に良い考えです。 aclocalを実行して、必要なM4マクロがaclocal.m4にコピーされるようにすることも忘れないでください。

関連する問題