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.

Était-ce utile?

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érer configure et Makefile.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 de make 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top