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 :

Makefile problème d'optimisation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut Makefile problème d'optimisation
    Bonjour à toutes et à tous !

    Je viens vers vous aujourd'hui car après moult recherches je fais face à un problème de compilation.
    En effet, on m'a conseillé "d'optimiser" la compilation de mon Makefile en mettant mes objets dans
    un dossier différent de mon dossier contenant mes sources (ce qui est effectivement bien plus propre).

    Je m'y prend donc comme ceci (cf d'autres topics du forum de developpez.net) :
    Nom : makefile.png
Affichages : 238
Taille : 10,1 Ko

    J'ai donc un message d'erreur :
    Nom : makefile2.png
Affichages : 214
Taille : 5,8 Ko

    J'ai essayé plusieurs méthodes, avec des 'addprefix' notamment, mais je ne trouve pas...
    Je précise que j'ai bien un dossier "src" contenant un fichier "main.c", un dossier "obj" et
    que mon Makefile est bien à la racine de mon dossier...

    Merci d'avance

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    donne nous ton makefile complet, et sous forme texte, qu'on puisse le sélectionner.

    A priori, il devrait y avoir une regle type
    $OBJDIR/%.o : $SRC/%.c

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Effectivement ça devrait être plus simple :

    CC = gcc

    NAME = test

    RM = rm -f

    SRC = src/main.c

    OBJDIR = obj
    OBJ = $(SRC:src/%.c=$(OBJDIR)/%.o)

    CFLAGS = -W -Wall -Werror $(INCLUDES)

    INCLUDES = -I inc/

    all: $(NAME)

    $(NAME): $(OBJ)
    $(CC) -o $(NAME) $(OBJ)

    clean:
    $(RM) $(OBJ)

    fclean: clean
    $(RM) $(NAME)

    re: fclean all

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Vous aviez raison, il manquait une règle :
    $(OBJDIR)/%.o: src/%.c
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) -c $< -o $@

    Je l'ai trouvé en farfouillant un peu plus sur internet mais au final je ne comprend pas
    ces lignes, pourriez-vous m'expliquer ?

    Merci

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    c'est pourtant assez direct:

    les règles sont de la forme suivante:
    cible  : dependances ...
    	action
    	action...
    make est appelé avec une ou plusieurs cible(s) à construire. Si on en lui en donne pas, c'est la première qui est utilisée.
    C'est pour cela qu'en général la première règle est all.

    Une règle définit la manière de produire une chose, et est considérée comme "a exécuter" si la chose en question est plus ancienne que l'une de ses dépendances.

    Tu as mis la regle suivante
    $(OBJDIR)/%.o: src/%.c
    	@mkdir -p $(dir $@)
    	$(CC) $(CFLAGS) -c $< -o $@
    Elle se lit ainsi:
    pour chaque fichier correspondant à $(OBJDIR)/%.o, c'est-à-dire, dans ton cas, obj/%.o, autrement dit, ceux listés par ls obj/*.o
        ce fichier dépend de src/%.c, c'est-à-dire le fichier équivalent, mais trouvé dans src
        pour générer ce fichier:
            executer (sans l'afficher car il y a un @) la commande mkdir -p $(dir $@)
            afficher et executer la commande $(CC) $(CFLAGS) -c $< -o $@
    Bien sur c'est encore un peu mystique.
    $(...) est la notation de makefile pour substituer une variable ou appeler une sous-commande.
    les autres $ sont des choses particulières de make
    • la première commande equivaut en bash à mkdir -p `dir $@`
    • la seconde commande equivaut en bash à gcc -W -Wall -Werror -I inc/ -c $< -o $@


    J'en viens à $@ et $<. le premier est la cible de la règle (à gauche du :), et $< à sa première dépendance (le premier nom à droite du :).

    la règle signifie donc:
    pour tout fichier .o dont j'aurai besoin dans le dossier obj
        ce fichier dépend d'un fichier de même nom mais avec l'extension .c et trouvé dans le dossier src
        pour générer ce fichier:
            on crée le dossier obj, en créant les dossiers intermédiaires si nécessaire (option -p)
            on execute gcc -W -Wall -Werror -I inc/ -c "le fichier .c" -o "le fichier .o"
    
    La règle indique comment produire un fichier .o dans obj/.
    Elle est utilisé parce que les dépendances de $(NAME) sont justement $(OBJ), qui sont dans $(OBJDIR)

    Au passage, je t'invite à ajouter -Wextra à ta compilation, cela active des warnings sur des problèmes qui sont potentiellement dangereux.
    Auquel cas, tu peux éventuellement supprimer -Werror pour ne pas arreter la compilation pour un warning.

    Edit:
    Nous avons un petit tuto sur make et ses Makefiles, n'hésite pas à le consulter

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 14
    Par défaut
    Merci pour cette explication très complète ! Tu m'as éclairé moi et quelques un de mes collègues
    Je ne savais pas qu'il était possible de rajouter autant de commandes dans un Makefile, c'est assez
    impressionnant d'ailleurs...

    Sous tes conseils je vais rajouter Wextra

    Merci encore et bonne fin de semaine !

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

Discussions similaires

  1. makefile problème compilation
    Par Goundy dans le forum C
    Réponses: 11
    Dernier message: 01/10/2006, 23h24
  2. algo problème d'optimisation (trajet)
    Par gugumon dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/06/2006, 17h35
  3. Réponses: 9
    Dernier message: 27/04/2006, 15h02
  4. Problème d'optimisation
    Par jozes dans le forum Langage
    Réponses: 8
    Dernier message: 15/02/2006, 15h41
  5. Recherche de pistes pour un problème d'optimisation
    Par TiKeuj dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/08/2005, 15h50

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