2009-07-04 5 views
2

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.

Répondre

2

Deux problèmes dans votre fichier configure.ac. Premièrement, la syntaxe de votre invocation AM_INIT_AUTOMAKE a 10 ans, je suppose que vous l'avez copiée à partir d'un très vieux tutoriel (indice: le manuel Automake a un tutorialish introduction). Vous avez déjà passé le package et la version à AC_INIT, il n'est pas nécessaire de répéter cela dans AM_INIT_AUTOMAKE. Deuxièmement, la liste des fichiers passés à AC_CONFIG_OUTPUT doit être une liste séparée par des espaces, donnée en premier argument.

En d'autres termes, votre configure.ac devrait ressembler à

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 

Notez qu'il n'y a pas de coma sur la ligne 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 configure. Ensuite, je suppose que vous devrez probablement diviser votre ligne app_LDADD en app_CPPFLAGS et app_LDFLAGS.

+0

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. –

+0

J'ai mis à jour mon post avec la solution à mon deuxième problème. –

+0

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

1

A quelques questions qui n'ont pas encore été mentionnés:

  • Utilisez autoreconf (re) génèrent configure et Makefile.in. Il appelle les outils requis dans le bon ordre.
  • préfère utiliser les macros make (“ $(FOO) ”) aux substitutions Autoconf (“ @[email protected] ”) dans votre makefile. L'avantage de l'ancien est qu'ils peuvent être remplacés à make fois si cela est nécessaire.
  • Je vous encourage à créer un répertoire de construction séparé et d'y exécuter configure plutôt que de construire dans les répertoires source. C'est une configuration que vous ne voulez probablement pas casser; et si vous ne le testez pas, vous pouvez le casser par inadvertance.
0

Plutôt que d'ajouter GTK _ CFLAGS et GTK _ LDFLAGS à votre forfait _ CFLAGS, vous pouvez simplement faire:

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

ou, si chaque application dépend de GTK, il suffit de faire

 
LDADD = @GTK_[email protected] 

Spécifier -g et -Wall comme vous êtes n'est pas vraiment une bonne chose. Vous pouvez le faire plus facilement en définissant AM _ CFLAGS, et bien que ce soit bien pour -Wall, vous ne voulez vraiment pas -g là-bas.La configuration par défaut ajoute -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é d'ignorer -g. Si vous ajoutez -g pour votre propre commodité (vous n'avez donc pas besoin de spécifier -g lorsque vous spécifiez CFLAGS au moment de la configuration), il serait plus approprié d'utiliser un CONFIG _ SITE plutôt que de coder en dur le -g dans votre projet construire des fichiers.

-1

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. N'oubliez pas non plus d'exécuter aclocal pour que les macros M4 requises soient copiées dans aclocal.m4.

Questions connexes