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.
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. –
Ich habe meinen Beitrag mit der Lösung meines zweiten Problems aktualisiert. –
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