IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Systèmes de compilation Discussion :

makefile pour compiler


Sujet :

Systèmes de compilation

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut makefile pour compiler
    Bonjour à tous , voilà j'ai écris un programme comportant 3 fichiers qui sont : Labyrinthe.cpp Joueur.cpp Joueur.h ( utilisant openGL et glut ). Pour la compilation je voudrais faire un makefile, pour l'instant j'ai écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Labyrinthe : Labyrinthe.o Joueur.o
    	g++ -o Labyrinthe Labyrinthe.o Joueur.o
     
    Joueur.o : Joueur.cpp Joueur.h
    	g++ -lglut -lGLU -lGL -o Joueur.o -c Joueur.cpp Joueur.h
     
    Labyrinthe.o : Labyrinthe.cpp Joueur.h
    	g++ -lglut -lGLU -lGL -o Labyrinthe.o -c Labyrinthe.cpp Joueur.h
    Le problème est que quand je saisis make dans le terminal j'obtiens :
    g++ -lglut -lGLU -lGL -o Labyrinthe.o -c Labyrinthe.cpp Joueur.h
    Labyrinthe.cpp: In function ‘int main(int, char**)’:
    Labyrinthe.cpp:21:29: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
    OuvrirNiveau("niveau.txt");
    ^
    g++ -lglut -lGLU -lGL -o Joueur.o -c Joueur.cpp Joueur.h
    g++ -o Labyrinthe Labyrinthe.o Joueur.o
    Labyrinthe.o: file not recognized: Format de fichier non reconnu
    collect2: error: ld returned 1 exit status
    make: *** [Labyrinthe] Erreur 1
    Je ne comprends pas pourquoi je n'arrive pas à obtenir mon binaire ...Auriez-vous une idée sur l'origine du problème? En vous remerciant par avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    -l et -L sont des options pour l'édition de lien, c'est utile pendant la création du programme (Labyrinthe : ...)
    les .h ne s'ajoutent pas à la ligne de compilation, sinon g++ va chercher à les compiler par eux même
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour, en essayant de faire comme tu as dis, c'est-à-dire si j'ai bien compris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Labyrinthe : Labyrinthe.o Joueur.o
    	g++ -l -L -o Labyrinthe Labyrinthe.o Joueur.o
     
    Joueur.o : Joueur.cpp Joueur.h
    	g++ -lglut -lGLU -lGL -o Joueur.o -c Joueur.cpp
     
    Labyrinthe.o : Labyrinthe.cpp Joueur.h
    	g++ -lglut -lGLU -lGL -o Labyrinthe.o -c Labyrinthe.cpp
    j'obtiens cette erreur:
    g++ -l -L -o Labyrinthe Labyrinthe.o Joueur.o
    /usr/bin/ld*: ne peut trouver -l-L
    Labyrinthe.o: file not recognized: Format de fichier non reconnu
    collect2: error: ld returned 1 exit status
    make: *** [Labyrinthe] Erreur 1

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Question préliminaire, sais-tu comment fonctionne la compilation en C++?

    Une règle make est de la forme:
    cible : dépendance...
    	commande
    	commande
    	commande
    pour créer compiler Joueur.cpp, tu as besoin pour l'essentiel de ceci:
    g++ -c Joueur.cpp
    -c est une option de g++ qui signifie "ne pas aller plus loin que la compilation proprement dite".

    -o permet de spécifier le nom du fichier de sortie (output)
    ainsi g++ -c Joueur.cpp -o bidule.truc produira non pas Joueur.o (le nom par défaut) mais bidule.truc.

    Une fois que tu disposes des traductions de chaque fichier cpp (chaque unité de traduction)
    il convient de les réunir en un programme: c'est l'étape d'édition des liens (linkage)
    la forme générale de la commande est
    g++ -L<un chemin ou trouver les libs> -l<une lib> -l<une autre lib> -o <nom du programme à produire> fichier1.o fichier2.o

    Bien qu'il soit affreusement long, je t'invite à regarder la documentation de g++ (par exemplela page man de linux.die.net, mais plus efficacement sur le site officiel)

    D'une manière générale, on n'utilise pas une commande sans savoir ce que fait chaque option. C'est potentiellement dangereux (enfin, plus ou moins).
    Par exemple, sur une maladresse, tu peux perdre ton code source.

    Crée un fichier perdu.cpp simple (mais valide, il faut que la compilation réussisse)
    puis execute la commande suivante
    g++ perdu.cpp -c && g++ perdu.o -o perdu.cpp
    puis relis perdu.cpp.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci pour ces éléments de réponse , j'ai donc réorganisé mon makefile que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    all: Labyrinthe
     
    clear: *.o
    	rm *.o
     
    Joueur.o:Joueur.cpp  Joueur.h
    	g++ -lglut -lGLU -lGL -o Joueur.o Joueur.cpp
     
    Labyrinthe.o:Labyrinthe.cpp Joueur.h
    	g++  -lglut -lGLU -lGL -o Labyrinthe.o Labyrinthe.cpp
     
    Labyrinthe:Labyrinthe.o Joueur.o
    	g++ -lglut -lGLU -lGL -o  Labyrinthe Labyrinthe.o Joueur.o
    je précise les dépendances sur mes 3 fichiers:
    _Labyrinthe.cpp
    #include <iostream>
    #include "GL/glut.h"
    #include <fstream>
    #include "Joueur.h"

    _Joueur.h
    #include "GL/glut.h"

    _Joueur.cpp
    #include "Joueur.h"
    #include "GL/glut.h"

    En effet lorsque je compile j'obtiens à présent:
    Labyrinthe.cpp.text+0x3e)*: référence indéfinie vers «*glutInit*»
    Labyrinthe.cpp.text+0x4d)*: référence indéfinie vers «*glutInitWindowPosition
    ...et tout ce qui peut faire référence à glut
    J'ai comme l'impression qu'il comprend mal les options -lglut -lGLU -lGL, vu que mes 3 fichiers utilisent glut j'ai mis ces options dans les 3 compilations (je ne sais pas trop s'il le fallait...). De plus, je me suis posé la question suivante glut est une librairie et pourtant il s'agit d'un fichier glut.h donc est-ce une librairie ou une dépendance, les deux? quelle est la différence?
    Pour résoudre mon problème dois-je indiquer que glut est une dépendance?

    En vous remerciant.

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2012
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2012
    Messages : 163
    Points : 624
    Points
    624
    Par défaut
    Salut
    Je crois que certains OS (ubuntu notamment) imposent de mettre les "-l" à la fin; donc essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    all: Labyrinthe
     
    clear: *.o
    	rm *.o
     
    Joueur.o:Joueur.cpp  Joueur.h
    	g++ -o Joueur.o Joueur.cpp
     
    Labyrinthe.o:Labyrinthe.cpp Joueur.h
    	g++ -o Labyrinthe.o Labyrinthe.cpp
     
    Labyrinthe:Labyrinthe.o Joueur.o
    	g++ -o Labyrinthe Labyrinthe.o Joueur.o  -lglut -lGLU -lGL
    Au passage, un Makefile permet d'utiliser des raccourcis (wildcard) et des règles implicites (et pour nettoyer c'est "clean" pas "clear" et on n'y met pas de dépendance sinon ça va compiler les .o pour ensuite les supprimer...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    all: Labyrinthe
     
    clean: 
    	rm -f *.o
     
    Labyrinthe:Labyrinthe.o Joueur.o
    	g++ -o  $@ $^ -lglut -lGLU -lGL
    Cela dit, make c'est très bien mais il faut connaitre. Si tu veux juste compiler sans trop te prendre la tête, cmake est peut-être plus simple

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup, tout fonctionne à présent , c'était la première fois que j'essayais de faire un makefile...J'espère rencontrer moins de difficulté la prochaine fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création d'un makefile pour cross-compilation
    Par joffrey575 dans le forum Matériel
    Réponses: 0
    Dernier message: 11/02/2015, 16h15
  2. Réponses: 1
    Dernier message: 15/11/2010, 21h13
  3. Makefile générique pour compilation projet C
    Par AuraHxC dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 13/12/2007, 21h29
  4. Création d'un makefile pour compilation automatique
    Par freestyler dans le forum Delphi
    Réponses: 48
    Dernier message: 08/06/2007, 14h47
  5. Compiler en C à partir de windows en manuel (makefile) pour Linux
    Par _SamSoft_ dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 06/04/2007, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo