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

C Discussion :

Faire un Makefile SDL


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Faire un Makefile SDL
    Bonjour,
    J'ai réalisé un projet en C en utilisant les librairies SDL2, SDL_ttf et SDL_image sous codeblocks.

    Maintenant, je souhaite que ce projet puisse être lancé sur linux facilement par un utilisateur. Je souhaite donc faire un makefile. Cependant je n'est pas encore trop l'habitude de faire des makefile. Je ne sais donc pas comment m'y prendre.

    Mon projet contient 3 fichiers .c (Window,Connexion,main) et 4 fichiers .h (Window,Connexion,main,constantes).

    Merci d'avance pour l'aide .

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Si tu n'as pas de contrainte spéciale, plutôt que d'utiliser make directement, tu utiliser cmake. Il te permet de générer des makefiles simples ainsi que des makefiles avec le projet Code::Blocks qui va avec. Serait-ce une solution acceptable dans ton cas ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    En fait, je voudrais le faire moi-même pour essayer de comprendre et d'apprendre pour des projets futur.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu peux apprendre à faire des fichiers cmake

    Si tu tiens vraiment à faire des fichiers make, tu peux aussi.

    Dans les 2 cas, tu trouveras des tuto ici dans la rubrique Tutoriels : https://c.developpez.com/cours/?page...ss-compilation

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Ok merci, je vous tiens au courant

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Bon j'ai fait mon makefile après avoir réussi à tout installer mais il ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SRCDIR=src
    HEADDIR=include
    LIBDIR=lib
     
     
    CFLAGS= -W -Wall $(shell sdl2-config --cflags)
    LDFLAGS=-export-dynamic $(shell sdl2-config --libs)
     
     
    all: window connexion
     
    window:
    	gcc -c $(SRCDIR)/Window.c -o $(LIBDIR)/Window.o $(CFLAGS) $(LDFLAGS)
     
    connexion:
    	gcc -c $(SRCDIR)/Connexion.c -o $(LIBDIR)/Connexion.o $(CFLAGS) $(LDFLAGS)
     
    main:
    	gcc -c $(SRCDIR)/main.c -o $(LIBDIR)/main.o $(CFLAGS) $(LDFLAGS)
     
    main:
    	gcc -o main $(LIBDIR)/Window.o $(LIBDIR)/Connexion.o $(CFLAGS) $(LDFLAGS)
     
     
    clean:
    	rm -rf $(LIBDIR)/*.o
    Voici son execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    makefile:22: avertissement*: surchargement de la recette pour la cible «*main*»
    makefile:19: avertissement*: ancienne recette ignorée pour la cible «*main*»
    gcc -c src/Window.c -o lib/Window.o -W -Wall -I/usr/local/include/SDL2 -D_REENTRANT -export-dynamic -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2
    gcc -c src/Connexion.c -o lib/Connexion.o -W -Wall -I/usr/local/include/SDL2 -D_REENTRANT -export-dynamic -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2

  7. #7
    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
    make te dit qu'il a une recette surchargé pour "main".

    Code make : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main:
    	gcc -c $(SRCDIR)/main.c -o $(LIBDIR)/main.o $(CFLAGS) $(LDFLAGS)
     
    main:
    	gcc -o main $(LIBDIR)/Window.o $(LIBDIR)/Connexion.o $(CFLAGS) $(LDFLAGS)

    La première recette produit non pas "main" mais "main.o"

    Voici une forme un peu corrigée: ajout des dépendances, suppression des flags inutiles.
    Code make : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    main.o: $(SRCDIR)/main.c
    	gcc -c $(SRCDIR)/main.c -o $(LIBDIR)/main.o $(CFLAGS)
     
    main: $(LIBDIR)/Window.o $(LIBDIR)/Connexion.o
    	gcc -o main $(LIBDIR)/Window.o $(LIBDIR)/Connexion.o $(LDFLAGS)

    Il y a plein d'améliorations possibles, encore, mais au moins, ca fonctionnera mieux.
    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

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Merci de ton aide . Mais mon makefile ne produit rien à la fin ...

    Voici ce que donne mon terminale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c src/window.c -o lib/window.o -W -Wall -I/usr/local/include/SDL2 -D_REENTRANT -export-dynamic -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2
    gcc -c src/connexion.c -o lib/connexion.o -W -Wall -I/usr/local/include/SDL2 -D_REENTRANT -export-dynamic -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2
    J'ai l'impression qu'il ne fait pas le main.

    Le makefile modifié au cas où j'ai fait encore des erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SRCDIR=src
    HEADDIR=include
    LIBDIR=lib
     
     
    CFLAGS= -W -Wall $(shell sdl2-config --cflags)
    LDFLAGS=-export-dynamic $(shell sdl2-config --libs)
     
     
    all: window connexion
     
    window:
    	gcc -c $(SRCDIR)/window.c -o $(LIBDIR)/window.o $(CFLAGS) $(LDFLAGS)
     
    connexion:
    	gcc -c $(SRCDIR)/connexion.c -o $(LIBDIR)/connexion.o $(CFLAGS) $(LDFLAGS)
     
    main.o: $(SRCDIR)/main.c
    	gcc -c $(SRCDIR)/main.c -o $(LIBDIR)/main.o $(CFLAGS)
     
    main: $(LIBDIR)/window.o $(LIBDIR)/connexion.o
    	gcc -o main $(LIBDIR)/window.o $(LIBDIR)/connexion.o $(LDFLAGS)
     
     
    clean:
    	rm -rf $(LIBDIR)/*.o

  9. #9
    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
    lis la documentation.
    La commande make sans arguments exécute la première cible trouvée dans le fichier.
    Dans ton cas, c'est all.
    all n'a pas de commande, mais deux dépendances, donc, celles-ci sont construites, mais main n'y figure pas, donc il ne se passe rien.

    Code make : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SRCDIR=src
    HEADDIR=include
    LIBDIR=lib
     
    CFLAGS= -W -Wall $(shell sdl2-config --cflags)
    LDFLAGS=-export-dynamic $(shell sdl2-config --libs)
     
     
    all: main
     
    main: $(LIBDIR)/window.o $(LIBDIR)/connexion.o
    	gcc -o main $(LIBDIR)/window.o $(LIBDIR)/connexion.o $(LDFLAGS)
     
    $(LIBDIR)/window.o: $(SRCDIR)/window.c
    	gcc -c $(SRCDIR)/window.c -o $(LIBDIR)/window.o $(CFLAGS)
     
    $(LIBDIR)/connexion.o: $(SRCDIR)/connexion.c
    	gcc -c $(SRCDIR)/connexion.c -o $(LIBDIR)/connexion.o $(CFLAGS)
     
    $(LIBDIR)/main.o: $(SRCDIR)/main.c
    	gcc -c $(SRCDIR)/main.c -o $(LIBDIR)/main.o $(CFLAGS)
     
    clean:
    	rm -rf $(LIBDIR)/*.o
     
    .PHONY: clean all
    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

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Ok. J'ai oublié de préciser que j'utilise aussi les pthread dans mon projet. Et alors il me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    gcc -o main lib/window.o lib/connexion.o -export-dynamic -L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,--enable-new-dtags -lSDL2
    /usr/bin/ld: lib/connexion.o: référence au symbole non défini «pthread_cancel@@GLIBC_2.2.5»
    //lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
    collect2: error: ld returned 1 exit status
    Makefile:13*: la recette pour la cible «*main*» a échouée
    make: *** [main] Erreur 1
    Donc il faut que dans mon makefile je fasse -lpthread ou -pthread ? Si oui où dois-je le faire ?

  11. #11
    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
    Un makefile, c'est jamais qu'une suite de règles "cible : dépendances -> commandes", avec la logique: si une cible est absente ou plus ancienne qu'une de ses dépendances, exécuter les commandes lui correspondant.

    Ce que tu mets dans tes règles, ce n'est pas le problème de make.
    Ton soucis, c'est que tu ne maîtrise pas le processus de compilation

    Compile complètement ton projet à la main, étape par étape, jusqu'à obtenir l'exécutable final, que tu dois exécuter (pour vérifier qu'il est correctement lié).
    Une fois cela compris, tu pourras procéder à l'automatisation par make.
    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

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Ok, juste une question dans sdl2-config, est-ce que sdl2_image, sdl2_ttf et sdl2_net sont compris dedans car j'ai des références indéfinies sur ces librairies.

Discussions similaires

  1. [C] Comment faire un scrolling ? {SDL}
    Par Moxostoma dans le forum SDL
    Réponses: 7
    Dernier message: 16/04/2009, 21h26
  2. Faire un Makefile pour mon projet perl
    Par rvfranck dans le forum Langage
    Réponses: 9
    Dernier message: 06/11/2008, 05h37
  3. faire un "Makefile" en ruby
    Par sheeft dans le forum Ruby
    Réponses: 2
    Dernier message: 01/04/2008, 19h45
  4. faire un makefile particulier
    Par reptils dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 05/03/2007, 00h19
  5. Faire un setenv dans un Makefile
    Par papayou42 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 06/07/2004, 10h37

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