2009-07-04 8 views
2

UPDATE: Erstes Problem gelöst, zweite am Ende dieses Beitrags beschrieben.In sehr einfache gtk2 c app, Problem beim Einrichten gnu Build-Tools

UPDATE2: Das zweite Problem wurde ebenfalls gelöst.

Ich versuche, über die Einrichtung von GNU-Build-Tools (Autoconf/Automake) für eine sehr einfache GTK + 2 C-Anwendung zu lernen. Ich habe this tutorial und this one that deals with sub directories gefolgt, aber ich laufe auf ein Problem, wo mein Quellverzeichnis (im Unterverzeichnis src) kein Makefile erzeugt, obwohl das Makefile des Elternverzeichnisses generiert wird.

Als erstes ist hier meine Ordnerstruktur:

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

Hier sind die Inhalte der wichtigen Dateien:

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` 

Hier ist, was passiert, wenn ich die folgenden Befehle ausführen:

$ 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 

Wenn ich überprüfen, die wichtigsten App-Ordner ein Makefile und Makefile.in bekommt, aber der src-Ordner hat immer noch nur Makefile.am. Irgendwelche Ideen?

UPDATE: ich die Änderungen von adl erwähnt gemacht, entfernt nämlich ich die eckigen Klammern und Komma aus dem AC_CONFIG_FILES Befehl und entfernt, um die App-Namen/Version vom AM_INIT_AUTOMAKE Befehl. Ich habe auch den Befehl app_LDADD in src/Makefile.am in app_LDFLAGS geändert. Dies hat mein anfängliches Problem behoben, dass ich nicht durch eine Konfiguration komme, aber jetzt sucht es nicht nach den gtk-Bibliotheken. Wenn ich ein make bekomme ich etwas wie folgt aus:

$ 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’ 

Hier ist, was ich mit pkg-config erhalten:

$ 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 

Ich bin mir ziemlich sicher, dass ich etwas falsch in meinem src mache /Makefile.am, aber ich weiß nicht was. Wenn es hilft, scheint mein Konfigurationsskript keine gtk libs zu suchen.

UPDATE2:

So scheint die grundlegende Lösung für das Problem in update1 zu sein, dass ich die folgende Überprüfung meiner configure.ac Datei hinzufügen benötigt:

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]) 

hinzugefügt Dies wird zu der Abschnitt "Prüfungen für Programme" unter AC_PROG_CC. Was dies tut, ist configure, um nach der Bibliothek gtk + -2.0 zu suchen. Der GTK in Großbuchstaben scheint ein beliebiger Variablenname zu sein, und CFLAGS, LIBS und LDFLAGS (und wahrscheinlich mehr) werden dynamisch hinzugefügt, so dass Sie die Variablen PACKAGE_ * generieren können. Die AC_SUBST scheint es so zu machen, dass Sie auf die PACKAGE * Variablen in Ihren Makefile.am's zugreifen können.FYI, das -export-dynamic-Flag wurde hinzugefügt, so dass Sie glade/gtkbuilder-Dateien verwenden können (ich bin mir sicher, dass es andere Gründe gibt, aber ich bin immer noch auf einer sehr grundlegenden Ebene des Verständnisses).

In src/Makefile.am, sollten Sie haben:

bin_PROGRAMS = app 

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

Dies scheint alles, was Sie für eine grundlegende gtk + -2.0 C app sein müssen. Es hat mich tatsächlich inspiriert, ein einfaches Tutorial zu schreiben, um eine C gtk-App zu erstellen, die Autotools verwendet. Es gibt definitiv einen Mangel an neueren Anfänger-Dokumentationen/Informationen in diesem Bereich.

Antwort

2

Zwei Probleme in Ihrer configure.ac Datei. Erstens, die Syntax Ihrer AM_INIT_AUTOMAKE Aufruf ist 10 Jahre alt, ich vermute, Sie haben es von einem sehr alten Tutorial kopiert (Hinweis: das Automake Handbuch hat eine tutorialish introduction). Sie haben das Paket und die Version bereits an AC_INIT übergeben. Es ist nicht erforderlich, das in AM_INIT_AUTOMAKE zu wiederholen. Zweitens sollte die Liste der Dateien, die an übergeben werden, eine durch Leerzeichen getrennte Liste sein, die als erstes Argument angegeben wird.

Mit anderen Worten, sollte Ihre configure.ac aussehen

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 

Hinweis gibt auf der AC_CONFIG_FILES Linie kein Koma.

Die -Wall Option werden automake zur Ausgabe mehr Warnungen führen (dies ist wirklich eine automake Option, keine gcc Option), dann ist es wahrscheinlich sicherer, wenn Sie diese Tools zu entdecken.

Dies sollte Ihr configure Problem beheben. Dann vermute ich, dass Sie wahrscheinlich Ihre app_LDADD Linie in app_CPPFLAGS und app_LDFLAGS teilen müssen.

+0

Danke für Ihre Antwort! Das hat mein erstes Problem gelöst, aber es hat ein zweites Problem aufgedeckt, das am Ende meines Posts erwähnt wird. –

+0

Ich habe meinen Beitrag mit der Lösung meines zweiten Problems aktualisiert. –

+0

Verwenden Sie INCLUDES nicht in Makefile.am, dies ist eine veraltete Variable: Verwenden Sie stattdessen AM_CPPFLAGS oder app_CPPFLAGS. (Mit -Wall, wie ich sagte, sollte Sie davor warnen.) Auch anstelle von "x = y; AC_SUBST ([x])" können Sie schreiben "AC_SUBST ([x], [y])". – adl

1

Noch ein paar Probleme, die bisher noch nicht erwähnt haben:

  • Verwendung autoreconf (wieder) erzeugen configure und Makefile.in. Es ruft die erforderlichen Tools in der richtigen Reihenfolge auf.
  • Ziehen den make Makros (“ $(FOO) ”) an die Autoconf Substitutionen (“ @[email protected] ”) in Ihrer Make-Datei verwenden. Der Vorteil der ersten ist, dass sie bei make Zeit überschrieben werden können, sollte das notwendig sein.
  • Ich würde Sie ermutigen, ein separates Build-Verzeichnis zu erstellen und configure dort statt in den Quellverzeichnissen zu erstellen. Dies ist ein Setup, das Sie wahrscheinlich nicht unterbrechen möchten. und wenn Sie es nicht testen, können Sie es versehentlich brechen.
0

Statt GTK Hinzufügen _ CFLAGS und GTK _ LDFLAGS zu Ihrem Paket _ CFLAGS, können Sie einfach tun:

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

oder, wenn jede App auf gtk hängt, nur tun

 
LDADD = @GTK_[email protected] 

Angabe von -g und -Wall, wie Sie sind, ist nicht wirklich eine gute Sache. Sie können es einfacher tun, indem Sie AM _ CFLAGS definieren, und während das für -Wall in Ordnung ist, wollen Sie wirklich nicht -g da drin.Die Standardkonfiguration fügt -g zu CFLAGS hinzu, und wenn der Benutzer CFLAGS überschreibt, wenn configure ausgeführt wird, sollten Sie ihnen vertrauen, um zu wissen, was sie tun, und ihnen die Freiheit geben, -g zu überspringen. Wenn Sie -g zu Ihrer eigenen Bequemlichkeit hinzufügen (Sie müssen also nicht -g angeben, wenn Sie CFLAGS zum Zeitpunkt der Konfiguration angeben), wäre es zweckmäßiger, eine CONFIG _ SITE zu verwenden, anstatt die -g in Ihrem Projekt hart zu codieren Dateien erstellen.

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

Es ist immer eine gute Idee, was Ihr aclocal Verzeichnis einen Blick zu nehmen (/ usr/aclocal) hält als Makro-Möglichkeiten:

-1

Eine weitere Möglichkeit hierfür könnte die folgende sein. Vergessen Sie auch nicht, aclocal auszuführen, damit die erforderlichen M4-Makros nach aclocal.m4 kopiert werden.