G++ & openGL

Signaler
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005
-
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005
-
j'ai un gros soucis de compilation de fichiers en c++ avec openGL.
En C tout se passe tres bien, mais en C++, rien ne va plus, expliquez moi pk voici le code du main.c:

#include<stdio.h>
#include"./Objet/Point.h"
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>

int main(void)
{
Point *p;

p=new Point(1,1,1);

printf("x=%f",p->GetX());

getchar();
return 0;
}

Voici mon makefile :

Swirsel3D:./Objet/Point.o main.o
gcc ./Objet/Point.o main.o -o Swirsel3D

main.o:./main.c ./Objet/Point.h
g++ -c ./main.c

Point.o:./Objet/Point.cc ./Objet/Point.h
g++ -c ./Objet/Point.cc

A la compilation j'ai ca :

In file included from ./main.c 3:
c:\\MINGW\\include\\gl/glu.h:262: parse error before '__attribute--'
....
type specifier omited for parameter

......
erreur dans le main.o

Comment fait on pour compiler un projet avec un makefile en ayant inclu une librairie?

Aidez moi svp, je comprend pas en C ca marche parfaitement
Merci

Le dire c'est bien, le faire c'est mieux ^^

28 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
je sais pas si ca viens de la mais utilise g++ pour linker, dans ce sens la tu peux avoir des problemes

g++ ./Objet/Point.o main.o -o Swirsel3D

oubli pas aussi delete p;
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

oui j'ai aussi mis
g++ ./Objet/Point.o main.o -o Swirsel3D
mais ca ne marche toujours pas

:), pour le delete c'est vrai.....mais ou ai je la tete :)
Enfin tu moment que ca compile pas, ya pas de soucis :p

Le dire c'est bien, le faire c'est mieux ^^
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
va voir dans glu.h, a la ligne 262 et autour

c'est quoi ?
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

Voici la ligne 162 et un peu avant :
#define GLU_TESS_MAX_COORD 1.0e150

/* Internal convenience typedefs */
typedef void (APIENTRY *_GLUfuncptr)();

283-284 (ya une erreur là aussi 284):
GLAPI void APIENTRY gluEndTrim (GLUnurbs* nurb);
GLAPI const GLubyte * APIENTRY gluErrorString (GLenum error);

285-286 (ya une erreur là aussi 286):
GLAPI void APIENTRY gluGetNurbsProperty (GLUnurbs* nurb, GLenum property, GLfloat* data);
GLAPI const GLubyte * APIENTRY gluGetString (GLenum name);

bon yen a encore beaucoup apres :)

Mais j'ai oublier de signaler la toute premiere dans Gl.h à la ligne 1024:
GLAPI GLenum APIENTRY glGetError( void );//1023
GLAPI const GLubyte* APIENTRY glGetString( GLenum name );//1024

Voilà, ca à l'air bien compliqué.....
Il doit y avoir un truc que le compilateur c++ n'aime pas, mais je ne sais pas quoi, en general qui dit C dit C++, non?

Le dire c'est bien, le faire c'est mieux ^^
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Et si tu renommais ton main.c en main.cpp (et adaptais le makefile bien sûr)...;)

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
EricLeRouge > a priori c ou c++ aucun pb dans ce sens la, verifi qd meme la presence de extern "C" dans les headers
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

extern C?
Je ne connais pas, pourrais tu me donner un exemple de header stp.
Merci

Le dire c'est bien, le faire c'est mieux ^^
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
pour indiquer au compilateur c++ que c'est du code c, il faut utiliser la directive extern c

dans un header

#ifdef __cplusplus /* car seul un compilateur c++ connait cette directive */

extern "C" {
#endif

/* les declarations & co */

#ifdef __cplusplus /* on ferme le bloc */
}
#endif

tu peux aussi declarer un fonction C de cette maniere

extern "C" void func(...);

enfin verifie au cas ou que tes headers opengl sont bien architecturés de cette facon

ps : j'avais demandé la ligne 262, pas 162, la ou il y a le __attribute
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

Je me suis trompé, c'était la ligne 262, et il n'y a pas __attribute
c'est pour ca que je ne comprend pas.

Je n'ai qu'un seul header celui de Point.cc (Point.h), il n'a donc pas besoin de ca puisque c'est du code c++ (c'est une classe).

Je l'ai tout de meme ajouté dans le main (au niveau des include), mais ca ne marche toujours pas.

Il bloque auniveau de l'inclusion des bibliotheque, mais elle marche tres bien avec gcc, pourquoi pas avec g++......

Merci quand meme pour ton petit cours :)

Le dire c'est bien, le faire c'est mieux ^^
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
sous linux j'ai jamais fais, sous win avec devcpp j'ai jamais eu de probleme (mon explorateur est compilé avec g++), a priori ca vient des headers qui ne semble pas convenir

pour le __attribute, il doit remplacer une macros, fais un gcc -P sur ce fichier pour voir exactement ce qu'il y a cette ligne
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ou g++ -P, c'est pareil
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Euh...l'extension .cc, c'est pas considéré comme du C? T'as bien mis l'extension .cpp à tous tes fichiers sources?

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ca pose aucun probleme, ca n'a pas d'importance
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Pas d'importance?? Et comment GCC saurait-il distinguer si ton fichier est en C ou C++? A cause du fait qu'il écrive g++ au lieu de gcc?
Moi je le ferais, rien que par convention, et par prudence...

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
g++ pour c++, sinon gcc

en parlant de convention les header c++ c'est sans extension pour les standard (c et c++) et .hpp pour le reste, et le .hpp est rarement respecter
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Pff, sans extension on ne voit ça qu'avec les libs standards, et je trouve ça stupide, si tu veux associer les headers avec un prog...
Aussi la différence .h/.hpp on s'en fout un peu, étant donné qu'un header n'est pas directement compilé...

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
si, le preprocesseur fais son boulot
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

Tres bien maintenant j'ai un jolie makefile dans les regles :

Swirsel3D:./Objet/Point.o main.o
g++ ./Objet/Point.o main.o -o Swirsel3D

main.o:./main.c ./Objet/Point.hpp
g++ -c ./main.c

Point.o:./Objet/Point.cpp ./Objet/Point.hpp
g++ -c ./Objet/Point.cpp

mais toujours cettes erreurs qui persistes :(

Le plus simple serai d'avoir un exemple complet d'un mini prog qui inclu une lib (par ex opengl) et qui est compilé avec en tant que fichier cpp. Si ca marche chez vous, il n'y a pas de raison que ca ne marche pas pour moi, non?
Le dire c'est bien, le faire c'est mieux ^^
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c'est illogique que ca fonctionne avec gcc et pas g++, t'es sur pour les extern "C" & co? et essay de voir les parse erreur, sort le listing du preprocesseur (g++ -E)
Messages postés
46
Date d'inscription
mardi 3 février 2004
Statut
Membre
Dernière intervention
7 décembre 2005

Ben en fait j'ai pas besoin de mettre d'extern "C" car je n'ai auccune fonction C, à part le main mais bon......
J'ai fait un g++ -E sur le le main, et j'ai un truc assez surprenant:
j'ai toute les fonction de glut qui s'affiche selon ce modele :

extern X __attribute__((__stdcall__)) nom_de_la_fonction(parametres)

ou X est soit void soit le type de retour (ex int).

J'avoue que je ne comprend strictement rien à tout ca :)

Le dire c'est bien, le faire c'est mieux ^^