En très simple app GTK2 c, problématisation jusqu'à gnu construire des outils
Question
UPDATE: Le premier problème résolu, d'autre part celui décrit dans le bas de ce message
.MAJ2:. Deuxième Le problème est résolu et
Je suis en train d'en apprendre davantage sur la mise en place d'outils de compilation GNU (autoconf / automake) pour un GTK + 2 application C très simple. J'ai suivi ce tutoriel et celui qui traite des sous-répertoires , mais je suis en cours d'exécution dans un problème où ma source répertoire (dans le sous-répertoire src) ne génère pas un Makefile, bien que le Makefile du répertoire parent est se produit.
Tout 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 encore n'a que le Makefile.am. Toutes les 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 aussi changé la commande app_LDADD dans src / Makefile.am à app_LDFLAGS. Cela a fixé mon problème initial de ne pas passer à travers une configuration, mais maintenant il ne cherche 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 assez sûr que je fais quelque chose de mal dans mon src / Makefile.am, mais je ne sais pas quoi. Si elle aide, mon script de configuration ne semble pas être à la recherche de toute librairies 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])
est ajouté aux contrôles de la section des programmes sous AC_PROG_CC. Ce que cela fait est de dire à configurer pour vérifier la bibliothèque GTK + -2.0. Le cas supérieur GTK semble être un nom de variable arbitraire et le CFLAGS, LIBS et LDFLAGS (et probablement plus) est ajouté à dynamiquement afin que vous puissiez générer les package_ variables *. Le AC_SUBST semble faire, vous pouvez donc accéder au package * variables dans votre Makefile.am de. Pour votre information, le drapeau -export dynamique est ajouté de sorte que vous pouvez utiliser les fichiers Glade / GtkBuilder (Je suis sûr qu'il ya d'autres raisons, mais je suis toujours à un niveau très basique de compréhension).
Dans src / Makefile.am, vous devriez avoir:
bin_PROGRAMS = app
app_SOURCES = main.c main.h
app_LDADD = @PACKAGE_LIBS@
app_LDFLAGS = @PACKAGE_LDFLAGS@
INCLUDES = @PACKAGE_CFLAGS@
Cela semble être tout ce que vous avez besoin pour une application GTK + -2,0 C de base. Il a en fait m'a inspiré pour écrire un tutoriel simple pour la mise en place d'une application C gtk qui utilise autotools. Il y a un manque flagrant de documentation récente débutant / information dans ce domaine.
La solution
Deux problèmes dans votre fichier configure.ac
. Tout d'abord, la syntaxe de votre invocation de AM_INIT_AUTOMAKE
est de 10 ans, je soupçonne que vous l'avez copié à partir d'un tutoriel très vieux (indice: le manuel Automake a tutorialish l'introduction). Vous avez déjà passé le paquet et sa version à AC_INIT
, il n'y a pas besoin de répéter que AM_INIT_AUTOMAKE
. En second lieu, la liste des fichiers transmis à AC_CONFIG_OUTPUT
doit être une liste séparée espace donné comme premier argument.
En d'autres termes, votre configure.ac
devrait ressembler à
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
Notez qu'il n'y a pas de coma sur la ligne de AC_CONFIG_FILES
.
L'option -Wall
provoquera automake
de sortie plus d'avertissements (ce qui est vraiment une option automake
, pas une option gcc
), il est probablement plus sûr si vous découvrez ces outils.
Cela devrait résoudre votre problème de configure
. Alors je suppose que vous aurez probablement à diviser votre ligne de app_LDADD
en app_CPPFLAGS
et app_LDFLAGS
.
Autres conseils
A quelques questions qui n'ont pas encore été mentionnés:
- Utilisez
autoreconf
(re) générerconfigure
etMakefile.in
. Il appelle les outils nécessaires dans le bon ordre. - Préférez l'utilisation des macros
make
(de «$(FOO)
») aux substitutions Autoconf (de «@FOO@
») dans votre makefile. L'avantage de l'ancien est qu'ils peuvent être remplacés au moment demake
si besoin est. - Je vous encourage à créer un répertoire de construction et exécuter
configure
séparés il y a lieu de construire dans les répertoires source. Ceci est une configuration que vous ne voulez probablement pas à briser; et si vous ne testez pas, vous pouvez le casser par inadvertance.
Plutôt que d'ajouter GTK_CFLAGS et GTK_LDFLAGS à vos PACKAGE_CFLAGS, vous pouvez simplement faire:
app_LDADD = @PACKAGE_LIBS@ @GTK_LIBS@
ou, si chaque application dépend de GTK, il suffit de faire
LDADD = @GTK_LIBS@
Spécification -g et -wall la façon dont vous êtes est pas vraiment une bonne chose. Vous pouvez le faire plus facilement en définissant AM_CFLAGS, et tout c'est très bien pour -Wall, vous ne voulez vraiment pas -g là-dedans. Le configure par défaut ajoutera -g à CFLAGS, et si l'utilisateur remplace CFLAGS lorsque configure est exécuté, vous devez leur faire confiance pour savoir ce qu'ils font et leur donner la liberté de sauter -g. Si vous ajoutez -g pour votre convenance (si vous ne avez pas besoin de spécifier -g lorsque vous spécifiez CFLAGS lors de la configuration), il serait plus approprié d'utiliser un CONFIG_SITE plutôt que hardcoding -g dans votre projet Construisons fichiers .
Une autre option pour ce qui pourrait être le suivant:
AM_PATH_GTK_2_0([Min version], [Succes], [Failure])
AM_PATH_GLIB_2_0([Min version], [Succes], [Failure])
Il est toujours une bonne idée de jeter un oeil à ce que votre répertoire aclocal (/ usr / aclocal) détient comme possibilités macro. De plus, ne pas oublier d'exécuter aclocal pour que les macros M4 requis est copié à aclocal.m4.