Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Constante dans un makefile utiliser dans un fichier .c

6 réponses
Avatar
deja
Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)

Comment faire pour compiler ça ?

Merci,

Axel

6 réponses

Avatar
DINH Viêt Hoà

Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)


<syntaxe GCC>
oulà ! on va entrer dans des choses spécifiques gcc.

Il va falloir compiler apropos.c avec :

gcc -DPACKAGE="$(PACKAGE)" -c apropos.c
</syntaxe GCC>

--
DINH V. Hoa,

"T'aurais pas une question sur le langage C" -- Emmanuel Delahaye

Avatar
deja
Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)


<syntaxe GCC>
oulà ! on va entrer dans des choses spécifiques gcc.

Il va falloir compiler apropos.c avec :

gcc -DPACKAGE="$(PACKAGE)" -c apropos.c
</syntaxe GCC>


la commande gcc appellé par le make est la suivante :

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../ -Iprotocol -g -O2
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/X11R6/include
-I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -MT apropos.o -MD -MP -MF
".deps/apropos.Tpo"
-c -o apropos.o `test -f 'apropos.c' || echo './'`apropos.c;
then mv -f ".deps/apropos.Tpo" ".deps/apropos.Po";
else rm -f ".deps/apropos.Tpo"; exit 1;
fi

n'y a t'il pas là dedans une commande qui récupere les constantes du
makefile ? Je pensais à "-DHAVE_CONFIG_H" à quoi sert il ?

Merci,

Axel


Avatar
Yves ROMAN

Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)


<syntaxe GCC>
oulà ! on va entrer dans des choses spécifiques gcc.

Il va falloir compiler apropos.c avec :

gcc -DPACKAGE="$(PACKAGE)" -c apropos.c
</syntaxe GCC>


la commande gcc appellé par le make est la suivante :

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../ -Iprotocol -g -O2
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/X11R6/include
-I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -MT apropos.o -MD -MP -MF
".deps/apropos.Tpo"
-c -o apropos.o `test -f 'apropos.c' || echo './'`apropos.c;
then mv -f ".deps/apropos.Tpo" ".deps/apropos.Po";
else rm -f ".deps/apropos.Tpo"; exit 1;
fi

n'y a t'il pas là dedans une commande qui récupere les constantes du
makefile ? Je pensais à "-DHAVE_CONFIG_H" à quoi sert il ?



Ca sert a definir la constante HAVE_CONFIG_H

Comme si tu avais en tete de ton .C un
#define HAVE_CONFIG_H

C'est dans ton makefile que tu dois ajouter des -D pour convertir les constantes
Shell/makefile en constantes C



Avatar
Richard Delorme

Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)


<syntaxe GCC>
oulà ! on va entrer dans des choses spécifiques gcc.

Il va falloir compiler apropos.c avec :

gcc -DPACKAGE="$(PACKAGE)" -c apropos.c
</syntaxe GCC>


la commande gcc appellé par le make est la suivante :

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../ -Iprotocol -g -O2
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/X11R6/include
-I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -MT apropos.o -MD -MP -MF
".deps/apropos.Tpo"
-c -o apropos.o `test -f 'apropos.c' || echo './'`apropos.c;
then mv -f ".deps/apropos.Tpo" ".deps/apropos.Po";
else rm -f ".deps/apropos.Tpo"; exit 1;
fi

n'y a t'il pas là dedans une commande qui récupere les constantes du
makefile ? Je pensais à "-DHAVE_CONFIG_H" à quoi sert il ?


On commence à devenir HS ici...
Ka commande -D de gcc sert à définir une macro, comme si, ici, le source
contenait #define HAVE_CONFIG_H. Lis le manuel de gcc pour en savoir plus.
Maintenant, le HAVE_CONFIG_H est sans doute une particularité de GNU
automake, qui indique au source qu'il peut inclure un fichier "config.h",
contenant des informations sur l'environnement de compilation. Il faut lire
le manuel d'automake (info automake) pour en savoir plus.

--
Richard



Avatar
DINH Viêt Hoà

la commande gcc appellé par le make est la suivante :

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../ -Iprotocol -g -O2
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/X11R6/include
-I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -MT apropos.o -MD -MP -MF
".deps/apropos.Tpo"
-c -o apropos.o `test -f 'apropos.c' || echo './'`apropos.c;
then mv -f ".deps/apropos.Tpo" ".deps/apropos.Po";
else rm -f ".deps/apropos.Tpo"; exit 1;
fi

n'y a t'il pas là dedans une commande qui récupere les constantes du
makefile ?


non.

--
DINH V. Hoa,

"un esprit sain dans un corps sain" -- voisin

Avatar
Boris HUISGEN
On Mon, 10 Nov 2003 10:23:51 +0100, Yves ROMAN wrote:


Bonjour,
J'ai un programme que je n'arrive pas à compiler.
Il utilise une constante qui est défini dans le makefile. Est ce
normal de pouvoir définir une constante comme ça ?

les fichiers concernés :
PACKAGE = G-cara-TK

et dans le apropos.c :
label0 = gtk_label_new(PACKAGE);

Et le message d'erreur qu'il me sort quand je fais un "make" :
apropos.c: In function `creer_fenetre_about':
apropos.c:62: `PACKAGE' undeclared (first use in this function)
apropos.c:62: (Each undeclared identifier is reported only once
apropos.c:62: for each function it appears in.)
apropos.c:63: `VERSION' undeclared (first use in this function)


<syntaxe GCC>
oulà ! on va entrer dans des choses spécifiques gcc.

Il va falloir compiler apropos.c avec :

gcc -DPACKAGE="$(PACKAGE)" -c apropos.c
</syntaxe GCC>


la commande gcc appellé par le make est la suivante :

if gcc -DHAVE_CONFIG_H -I. -I. -I.. -I../ -Iprotocol -g -O2
-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/X11R6/include
-I/usr/include/freetype2 -I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include -MT apropos.o -MD -MP -MF
".deps/apropos.Tpo"
-c -o apropos.o `test -f 'apropos.c' || echo './'`apropos.c;
then mv -f ".deps/apropos.Tpo" ".deps/apropos.Po";
else rm -f ".deps/apropos.Tpo"; exit 1;
fi

n'y a t'il pas là dedans une commande qui récupere les constantes du
makefile ? Je pensais à "-DHAVE_CONFIG_H" à quoi sert il ?



Ca sert a definir la constante HAVE_CONFIG_H

Comme si tu avais en tete de ton .C un
#define HAVE_CONFIG_H

C'est dans ton makefile que tu dois ajouter des -D pour convertir les
constantes

Shell/makefile en constantes C



Cela est fait automatiquement par autoconf/automake. C'est dans le
fichier configure.in qu'on définit des macros qui seront reprises dans
les sources par l'intermédiaire du fichier config.h.

Dans ses dernières versions, autoconf se charge de définir de lui-même
les deux macros PACKAGE et VERSION, si bien qu'on peut directement les
utiliser dans les sources, si on inclut préalablement le fichier config.h
et s'il est généré par le ./configure.

Vu les erreurs de compilation, il semblerait que :
- soit les macros ne sont pas définies par le ./configure
- soit que le fichier apropos.c n'inclue par le header config.h.
Pour vérifier çà, regarde le contenu du fichier config.h. Si PACKAGE /
VERSION ne sont pas présents, alors il faut mettre à jour autoconf et
automake (les versions anciennes d'autoconf ne définissaient pas
automatiquement ces macros si je ne me trompe pas). Sinon, ajoute
simplement le fichier include config.h dans le fichier apropos.c, comme
ceci :

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

Normalement, cela devrait être fait une seule fois dans le header commun
de l'ensemble des sources...

Plus précisément, autoconf réussit à définir ses 2 macros gràce aux
valeurs de AC_INIT (ou encore AM_INIT_AUTOMAKE) et elles sont
automatiquement ajoutées au fichier config.h qui contient le résultat
des tests du ./configure : présence des headers, fonctions, ainsi
que les macros explicitement définies par l'utilisateur.
Par exemple pour définir la macro USE_SSL (et au lieu d'utiliser l'option
-D de gcc), on ajoute dans le configure.in une ligne AC_DEFINE. Par ex:

AC_DEFINE(USE_SSL, [], [use OpenSSL library])

La syntaxe étant :

AC_DEFINE(MACRO, [valeur], [un commentaire de la macro])

Cela ajoutera automatiquement la macro dans le config.h si configure.in
contient au début l'option AC_CONFIG_HEADER([config.h]) et si autoheader
a été appellé lors de la création du script ./configure (séquence
normale : aclocal; autoconf; autoheader; automake)

Maintenant, pour faire des variables dans les Makefile.in, on fait comme
cela dans le configure.in :

host="win32"
AC_SUBST(host)

A présent, toute mention de @host@ dans les Makefile.in et autres
fichiers déclarés par AC_CONFIG_FILE, sera remplacé par win32. En
gros, c'est utile pour la compilation conditionnelle. Parfois aussi, il
est nécessaire de manipuler les deux en même temps, AC_DEFINE et
AC_SUBST.