Erreur de compilation d'un programme en "C&qu

Fermé
Abdel Majid - 2 oct. 2003 à 23:01
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 - 3 oct. 2003 à 20:08
Bonsoir tout le monde, voilà, j'ai téléchargé un exemple écrit en "C" pour créer une fenêtre sous RedHat,mais voilà :
dans le programme , je dois faire appel à la biblioyhéque "X11/XLib.h", mais quand je compile :
make nomdefichier où
cc -onomdefichier nomdefichier.c où ...

je reçois ces messages :

cc nomdefichier.c -o nomdefichier
/tmp/ccyNCTZZ.o(.text+0X17): In function 'main' :
: référence indéfinie vers "XOpenDisplay"
/tmp/ccyNCTZZ.o(.text+0X2b): In function 'main' :
: référence indéfinie vers "DefaultScr"
/tmp/ccyNCTZZ.o(.text+0X6d): In function 'main' :
: référence indéfinie vers "DefaultScree"........

les "XOpenDisplay" et "DefaultScr" et "DefaultScree", sont des noms de fonctions qui sont appelés dans le programme écrit en langage "C".
Est ce que quelqu'un peut m'aider pour réaliser ce petit programme?
Merci à tout le monde

1 réponse

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 oct. 2003 à 03:33
Salut,

Peux-tu, d'une part verifier la présence sur ton system de Xlib.h
je pense dans "/usr/X11R6/include/X11/Xlib.h"
[shell]# find /usr | grep X[Ll]ib.h

D'autre part, copier coller le code C que tu essayes de comiler ?

Merci:)

@+
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
voici le code complet :


/*
* xsimple : Affiche une chaine dans une fenetre X...
*/

#include <stdio.h>
#include <X11/Xlib.h>


En premier lieu, on inclut le fichier stdio.h (ça peut toujours servir) et surtout le fichier X11/Xlib.h qui contient les définitions des types et constantes utilisées par la Xlib.


GC gc;
Display *display;
int screen;
Window win, root;
unsigned long white_pixel, black_pixel;


On déclare les variables globales utilisées par le programme (contexte graphique, display, screen, fenêtres et "couleurs" noir et blanc).


/*
* fonction associee a l'evenement EXPOSE
*/

void expose ()
{
XDrawString (display, win, gc, 10, 30, "Hello, world !", 14);
}


Cette fonction est appelée lorsque la fenêtre win reçoit l´évènement Expose. Ceci arrive dans deux cas seulement :

lorsque la fenêtre est affichée à l´écran par un XMapWindow

lorsqu´une portion de la fenêtre précedemment couverte par une autre redevient visible (et que le serveur X ne fait pas de gestion interne des recouvrement - ou backing-store)


ATTENTION: on ne peut pas écrire dans une fenêtre AVANT qu´elle n´ait reçu son premier évènement Expose.


Lors de la réception de l´évènement Expose, on affiche la chaine "Hello, world" aux coordonnées (10, 30) de la fenêtre win.


/*
* programme principal
*/

main(ac, av)
int ac;
char **av;
{
char *dpyn = NULL;

/* selection du display en ligne */
if (ac == 3) {
if (strcmp (&av[1][1], "display") == 0) {
dpyn = av[2];
}
else {
fprintf (stderr, "Usage: xsimple [-display display_name]\n");
exit (1);
}
}

if ((display = XOpenDisplay (dpyn)) == NULL) {
fprintf (stderr, "Can't open Display\n");
exit (1);
}


Dans le programme principal, on ouvre tout d´abord une connexion avec un serveur X (donné par le contenu de la variable d´environnement DISPLAY). On peut également passer la valeur du display en paramètre sur la ligne de commande (par convention, c´est l´option -display). Il suffit ensuite d´appeler la fonction XOpenDisplay qui renvoit un pointeur de Display si il existe.


gc = DefaultGC (display, screen);
screen = DefaultScreen (display);
root = RootWindow (display, screen);
white_pixel = WhitePixel (display, screen);
black_pixel = BlackPixel (display, screen);


On récupère les valeurs par défaut des différentes variables (contexte graphique, screen, ...). Pour celà, on utilise des macros-instructions définies dans X11/Xlib.h .


win = XCreateSimpleWindow (display, root, 0, 0, 100, 90, 2, black_pixel, white_pixel);

XSelectInput (display, win, ExposureMask);

XStoreName (display, win, "xsimple");
XMapWindow (display, win);


On crée ensuite la fenêtre win par la fonction XCreateSimpleWindow. Cette fenêtre a pour parent la root-window, ses dimensions sont 100 sur 90 pixels, 2 pixels d´épaisseur pour le bord, fond blanc, bord noir.

L´appel à XSelectInput indique que la fenêtre ne s´intéresse qu´à l´évènement Expose (ExposureMask).

La fonction XStoreName permet de nommer la fenêtre pour le window-manager (dans notre cas, le nom xsimple s´affichera dans le bandeau du window-manager).

Enfin, la fonction XMapWindow affiche la fenêtre à l´écran.


for (;;) {
XEvent ev;
char c;

XNextEvent (display, &ev);

switch (ev.type) {

case Expose :

expose ();
break;

default :

break;

}
}
}


Voici la partie "active"du programme. C´est une boucle infinie de lecture des évènements X (appel à la fonction XNextEvent). Les évènements sont ensuite traités suivant leur type (ev.type) dans un switch (dans notre cas, seul l´évènement Expose est associé à une fonction)


Pour compiler ce programme sous l´environnement de développement X, on pourra utiliser le fichier Imakefile suivant :


LDLIBS = $(XLIB)
SimpleProgramTarget(xsimple)


avec la séquence suivante :

"xmkmf" pour générer le Makefile à partir de l´Imakefile

"make depend"pour générer les dépendances des fichiers à la fin du Makefile

"make all" pour compiler le programme .


à toi de m'éxpliquer ce que je dois faire une fois que je tape le code en C.
Merci
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > Abdel Majid
3 oct. 2003 à 19:33
Quand tu as prix ce code, tu a pris le Imakefile avec ?
Il doit etre dans le répertoir ou est ton fichier source...

Ensuite en tapant "xmkmf -a" ca devrait marcher...

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
Abdel Majid > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
3 oct. 2003 à 19:58
Non, l'éxemple était écrit sur une page Web et donc je l'ai simplement copié.
Tu ne peux pas me donner un exemple de création de fenêtre en "C".
merci
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426 > Abdel Majid
3 oct. 2003 à 20:08
Bah je ne l'ai fait qu'avec Glade donc en GTK+
Et ce n'est pas du tout la meme syntaxe que le prog au dessus.
Il y a tellement de fichier generés que ca risque d'etre un peu lourd copier-coller.

Mais si tu as le courage, installes Glade, et regarde sur le site http://glade.gnome.org/ , il y a quelques tutos.

bonne continuatio! @+

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0