MISE À JOUR: Premier problème résolu, le second décrit en bas de ce post.Dans une application gtk2 c très simple, problème de configuration des outils de construction gnu
UPDATE2: Deuxième problème résolu également. J'essaie d'apprendre à configurer les outils de compilation GNU (autoconf/automake) pour une application très simple de GTK + 2C. J'ai suivi this tutorial et this one that deals with sub directories, mais je rencontre un problème où mon répertoire source (dans le sous-répertoire src) ne génère pas de fichier Makefile, bien que le Makefile du répertoire parent soit généré.
D'abord, voici ma structure du dossier:
app/src
- main.c
- main.h
- Makefile.am
app
- configure.ac
- Makefile.am
- aclocal.m4
(... other generated files ...)
Voici le contenu des fichiers importants:
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`
Voici ce qui se passe quand je lance les commandes suivantes:
$ 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
Quand je vérifie, le dossier principal de l'application obtient un Makefile et Makefile.in, mais le dossier src a toujours le Makefile.am. Des idées?
MISE À JOUR: J'ai fait les changements mentionnés par adl, à savoir, j'ai enlevé les crochets et la virgule de la commande AC_CONFIG_FILES et supprimé le nom app/version à partir de la commande AM_INIT_AUTOMAKE. J'ai également changé la commande app_LDADD dans src/Makefile.am à app_LDFLAGS. Cela a résolu mon problème initial de ne pas passer par un configure, mais maintenant il ne cherche pas les bibliothèques gtk. Quand je fais une marque je reçois quelque chose comme ce qui suit:
$ 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’
Voici ce que je reçois avec 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
Je suis sûr que je fais quelque chose de mal dans mon src /Makefile.am, mais je ne sais pas quoi. Si cela aide, mon script configure ne semble pas rechercher de librairie gtk.
MAJ2:
Donc, la solution de base pour le problème Update1 semble que je devais ajouter le contrôle suivant à mon dossier 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])
Ceci est ajouté à la section chèques pour les programmes sous AC_PROG_CC. Ce que cela fait est de dire à configure de vérifier la bibliothèque gtk + -2.0. La majuscule GTK semble être un nom de variable arbitraire, et les CFLAGS, LIBS et LDFLAGS (et probablement plus) y sont ajoutés dynamiquement afin que vous puissiez générer les variables PACKAGE_ *. Le AC_SUBST semble le rendre si vous pouvez accéder aux variables PACKAGE * dans votre Makefile.am.Pour info, le drapeau -export-dynamic est ajouté afin que vous puissiez utiliser les fichiers glade/gtkbuilder (je suis sûr qu'il y a d'autres raisons, mais je suis encore à un niveau de compréhension très basique).
src/Makefile.am, vous devriez avoir:
bin_PROGRAMS = app
app_SOURCES = main.c main.h
app_LDADD = @[email protected]
app_LDFLAGS = @[email protected]
INCLUDES = @[email protected]
Cela semble être tout ce que vous avez besoin pour un gtk de base + -2,0 app C. Cela m'a en fait inspiré d'écrire un tutoriel simple pour configurer une application C gtk utilisant autotools. Il y a un manque certain de documentation/d'information débutant récente dans ce domaine.
Merci pour votre réponse! Cela a résolu mon premier problème, mais il a mis au jour un deuxième problème mentionné au bas de mon message. –
J'ai mis à jour mon post avec la solution à mon deuxième problème. –
N'utilisez pas INCLUDES dans Makefile.am, il s'agit d'une variable obsolète: utilisez plutôt AM_CPPFLAGS ou app_CPPFLAGS. (En utilisant -Wall comme je l'ai dit devrait vous avertir à ce sujet.) Aussi à la place de "x = y; AC_SUBST ([x])" vous pouvez écrire "AC_SUBST ([x], [y])". – adl