Prob de compilation en C++ sous Linux

J’ai un problème de compilation d’un projet en C++ sous linux debian.

Il s’agit d’un programme en OpenGL et je n’arrive pas à charger une texture jpeg, lors de la compilation, il me met les erreurs suivantes :

gcc -Wall -pedantic -c Graphics.cpp -o Graphics.o
gcc -Wall -pedantic -c Game.cpp -o Game.o
gcc -Wall -pedantic -c mainmain.cpp: In fugcc -Wall -pedantic Texture.o Graphics.o Game.o main.o -o spacecrow -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm -ljpeg
ons
main.cpp:229: warning: comparison between signed and unsigned integer
expressions
Texture.o: In function Texture::loadJpegImage(char *)': Texture.o(.text+0x196): undefined reference tojpeg_std_error(jpeg_error_mgr *)’
Texture.o(.text+0x1b7): undefined reference to jpeg_CreateDecompress(jpeg_decompress_struct *, int, unsigned int)' Texture.o(.text+0x213): undefined reference tojpeg_stdio_src(jpeg_decompress_struct *, _IO_FILE *)’
Texture.o(.text+0x227): undefined reference to jpeg_read_header(jpeg_decompress_struct *, int)' Texture.o(.text+0x29c): undefined reference tojpeg_start_decompress(jpeg_decompress_struct *)’
Texture.o(.text+0x2f2): undefined reference to jpeg_read_scanlines(jpeg_decompress_struct *, unsigned char **, unsigned int)' Texture.o(.text+0x30b): undefined reference tojpeg_finish_decompress(jpeg_decompress_struct *)’
Texture.o(.text+0x31d): undefined reference to `jpeg_destroy_decompress(jpeg_decompress_struct *)’
collect2: ld returned 1 exit status
make: *** [all] Erreur 1

Il s’agit sans doute d’un problème de linkage avec les librairies jpeg, mais je ne vois pas du tout comment corriger l’erreur.
Si vous avez une idée qui pourait me mettre sur la voie, ca m’arrangerai bien.

Je sais, j’ai honte, mettre Windows Xp et caramail dans la même phrase ca devrait être interdit ! Mais bon, chacun à ces défauts.

[Edit]
Je tient à te remerchier c0unt0 car après avoir modifier le fichier jpeglib.h grace à tes conseils et après aussi avoir corriger toute mes erreurs mon programme fonctionne impec.
Maintenant que j’ai finis les textures, je vais voir comment les appliquer sur des modèles plus compliquer que le simple cube.
[/Edit]

[Edité le 2/11/2002 par ZGoblin]

[quote]j’ai rebouter sur Win XP pour aller sur caramail[/quote]Oh mon dieu!! :open_mouth: si c’est pas malheureu de voir ca… :yltype:

Merci moktar pour ces réponses, je testerai plus tard car j’ai rebouter sur Win XP pour aller sur caramail et merci aussi à cOunt0.

Arf bon j’arrive trop tard alors.

Comment une bibliothèque C ne supporte-t-elle pas d’être appelée depuis un prog C++ ? c’est vraiment daubale. Je n’ai jamais vu ça.

En fait, je pense que d’ajouter les directives indiquées par cOuntO suffirait pour que le compilo génère les bon appels et les bonnes ref.

Pour ton second essai, je pense que tu as soit oublié d’oter la déclaration de cette méthode dans la classe, soit oublié de préciser dans Texture.h que la fonction est déclarée ailleurs ( extern TextureImage * loadJpegImage(char *fichier) ; )

Il n’y a aucune raison pour que tu ne puisses pas appeler ta fonction C depuis ta classe. C’est pratique courante.

J’ai regardé ton code et j’ai fait la seconde manip. que tu décris (en vidant tout contenu spécifique Linux, car je n’ai pas cet OS) et ça rulezzz. Néanmoins, refait un essai en dégageant l’appel de la méthode loadJpegImage du constructeur de la classe Texture ou/et passe cette méthode en “Public”. Je crois me souvenir que le compilo/linker Linux est buggé de ce côté. Fais l’essai, ça en vaut la peine.

Tiens nous au courant.

Sans problème, je te les envois tout de suite, mais j’ai trouvé la solution- sur internet : la bibliothèque libjpeg ne supporte pas le C++, il existe des patchs et je suis en train de les chercher sur internet ou dans le pire des cas, j’utiliserai plutot une lib TGA ou TIFF.

Je développe sous Linux Mandrake et mon prog utilise donc les bibliothèque GL, GLU et GLX.

Peux-tu m’envoyer un ensemble source “main + fichiers adéquats” qui reproduisent ce problème. J’aimerai un truc très très réduit pour ne pas que je mette 3 plombes à fouiller.

J’ai un peu de mal à voir ce que tu as développé et ce dont tu te sers…

mok.tar@freesbee.fr

Je pense que c’est à cause des appels C dans une classe C++, je ne maitrise pas encore très bien le C++ (en fait c’est mon tout premier prog) pour savoir comment procéder.

J’ai fais quelques modification : j’ai créer un nouveau fichier C dans lequelle j’ai mis la fonction :
extern TextureImage * loadJpegImage(char *fichier)
j’arrive à compiler ce fichier sans problème, mais il me met le même genre d’erreur que précédemment lorsque j’apelle cette fonction depuis ma classe Texture.

Voici le message d’erreur :

gcc -Wall -pedantic -c Graphics.cpp -o Graphics.o
gcc -Wall -pedantic -c Game.cpp -o Game.o
gcc -Wall -pedantic -c mainmain.cpp: In fugcc -Wall -pedantic loadtexture.o Texture.o Graphics.o Game.o main.o -o spacecrow -L/usr/X11R6/lib -lGL -lGLU -lXxf86vm -ljpeg
29: warning: comparison between signed and unsigned integer
expressions
Texture.o: In function Texture::Texture(char *, char *)': Texture.o(.text+0x16): undefined reference toloadJpegImage(char *)’
collect2: ld returned 1 exit status
make: *** [all] Erreur 1

Voila, il faudrai que je recherche sur internet ou dans mes bouquins comment implémenter des fonctions C dans des classes C++ grace à “#ifdef __cplusplus…” je pense d’après ce que m’a indiquer c0ount0.

Pour ce qui est de l’ordre des objets/lib, je ne pense pas que ca joue, voici mon makefile:

[i]
CC = gcc
CFLAGS = -Wall -pedantic
LIBS=-lGL -lGLU -lXxf86vm -ljpeg
LIBSDIR= -L/usr/X11R6/lib

OBJS = loadtexture.o Texture.o Graphics.o Game.o main.o

all: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o spacecrow ${LIBSDIR} ${LIBS}

loadtexture.o: loadtexture.c loadtexture.h
$(CC) $(CFLAGS) -c loadtexture.c -o $@

Texture.o: Texture.cpp Texture.h
$(CC) $(CFLAGS) -c Texture.cpp -o $@

Graphics.o: Graphics.cpp Graphics.h Texture.o
$(CC) $(CFLAGS) -c Graphics.cpp -o $@

Game.o: Game.cpp Game.h Graphics.o
$(CC) $(CFLAGS) -c Game.cpp -o $@

main.o: main.cpp Game.o
$(CC) $(CFLAGS) -c main.cpp -o $@

clean:
@echo Cleaning up…
@rm -f spacecrow core *.o
@echo Done.
[/i]

Pour ce qui est de la remarque de cOuntO, je confirme il faut faire attention à l’ordre des objets/Lib mais c’est normal et non spécifique au compilo GNU. Règle à toujours utiliser : décrire d’abord les objets puis les bibliothèques. Enfin, dans ton cas ce n’est pas le problème.

Vraisemblablement tu n’a pas précisé, soit le bon nom de la bibliothèque (-ljpeg) soit tu n’a pas précisé au linker le chemin de recherche où se trouve la bibliothèque.

Le chemin /usr/X11R6/lib contient-il la bibliothèque jpeg ?

je sais que dans certaine implementation, le GCC est sensible a l’ordre dans lequel tu mets tes fichiers objets et tes libraries:
bob.o -ljpeg bib.o ne donne pas le meme resultat que bob.o bib.o -ljpeg

l’autre truc c que tu fait des appels C depuis une classe C++, donc il faut peut etre que tu fasse un define genre -D__cplusplus ou autre pour prevenir les header/le compilo.
Verifie dans le header de la lib jpeg si il y a pas un truc du style
#ifdef __cplusplus
extern “C”
{
#endif
[function definition]
#ifdef __cplusplus
}
#endif /* __cplusplus */

ou un truc dans le meme genre./

Moi je sais.
Il faut eviter de comparer un signed et un unsigned integer. Parceque ca peut faire n’importe quoi, et du coup ca compile pas.

Comment ca :smiley: ?