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 :

Compilation modulaire avec makefile et plusieurs implantations


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Compilation modulaire avec makefile et plusieurs implantations
    Bonsoir à tous !

    J'ai créé 3 implantations pour un type de liste, les noms de fonctions et autres déclarations sont les mêmes pour chaque implantations.
    J'aimerai savoir s'il y a un moyen de créer un seul fichier test.c, et avec un makefile de créer 3 executables (test1, test2, test3) dont chacun serait fait ave une implantation différente.

    J'ai essayé de bidouillé avec l'option -D de gcc mais cela n'a rien donné de concluant...

    Merci d'avance à qui pourra m'aider ou m'orienter

  2. #2
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Bonsoir,
    C'est possible avec l'option -D de gcc comme tu as essayé , un exemple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    int main ()
    {
    #ifdef ONE 
       printf("1\n");
       return(0);
    #endif
    #ifdef TOW
       printf("2\n");
       return 0;
    #endif
    }
    Par contre si tu veux ne faire qu'un seul makefile , il faut ajouter les précédents exécutables dans les exécutables à faire ensuite , sinon il ne fera que l’exécutable de la première ligne .
    Voici un exemple pour le code fourni ci dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1: test.c 2
    	gcc -D ONE test.c -o 1
    2: test.c
    	gcc -D TOW test.c -o 2

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Hmmmm... Je ne comprends pas trop...

    Mes fichiers sont comme ceci :
    [src]
    ----makefile
    ----test.c
    ----[list1]
    --------list1.h
    --------list1.c
    ----[list2]
    --------list2.h
    --------list2.c
    ----[list3]
    --------list3.h
    --------list3.c

    J'ai essayé de mettre -DLIST1 en option de compil', avec le code suivant dans test.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef LIST1
    #include list1/list1.h
    #endif
    Mais ça ne marche pas...

  4. #4
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Je ne sais pas exactement ce que tu veux mettre dans ton test.c mais imaginons que c'est ça :
    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
    #include <stdio.h>
    #ifdef LIST1
        #include "list1/list1.h"
    #endif
    #ifdef LIST2
        #include "list2/list2.h"
    #endif
    #ifdef LIST3
        #include "list3/list3.h"
    #endif
     
    int main()
    {
    #ifdef LIST1
        /** code pour list1 **/
    #endif
    #ifdef LIST2
        /** code pour list2 **/
    #endif
    #ifdef LIST3
        /** code pour list3 **/
    #endif
     
        return 0;
    }
    Ton makefile devrait ressembler à ça : ( si je ne dis pas n'importe quoi , je ne l'ai pas testé )
    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
    list1Prog: test1.o list1.o list2Prog
    	gcc test1.o list1.o -o list1Prog
    list2Prog: test2.o list2.o list3Prog
    	gcc test2.o list2.o -o list2Prog
    list3Prog: test3.o list3.o
    	gcc test3.o list3.o -o list3Prog
    test1.o: test.c 
    	gcc -c -D LIST1 test.c -o test1.o
    test2.o: test.c 
    	gcc -c -D LIST2 test.c -o test2.o
    test3.o: test.c 
    	gcc -c -D LIST3 test.c -o test3.o
    list1.o: ./list1/list1.c ./list1/list1.h
    	gcc -c ./list1/list1.c
    list2.o: ./list2/list2.c ./list2/list2.h
    	gcc -c ./list2/list2.c
    list3.o: ./list3/list3.c ./list3/list3.h
    	gcc -c ./list3/list3.c

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Mon code ressemblerait plutôt à ceci :
    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
     
    #include <stdio.h>
    #ifdef LIST1
        #include list1/list1.h
    #endif
    #ifdef LIST2
        #include list2/list2.h
    #endif
    #ifdef LIST3
        #include list3/list3.h
    #endif
     
    int main()
    {
      /* code sur les listes, chaque fichier .h contient les mêmes prototypes de fonctions, donc pas de différenciations */
        return 0;
    }
    Je suis fatigué, je testerai demain et repasserai pour dire ce que ça donne

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai testé pour une seule implantation de liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    test: test.o ./list1/list1.o
        gcc test.o ./list1/list1.o -o test
     
    test.o : test.c
        gcc -c -D LIST1 test.c -o test.o
    ./list1/list1.o : ./list1/list1.c ./list1/list1.h
        gcc -c ./list1/list1.c
    Ca ne marche pas.
    La macro LIST1 créée avec "-D LIST1" ne semble pas exister lors de la compilation de test.c.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Essaye de supprimer l'espace entre la bascule D et la macro "-Dtartempionlaridelle"

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai déjà essayé mais sans succès

  9. #9
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    peut tu montrer exactement ton makefile et ton fichier test.c ?
    Parce que chez moi le makefile fonctionne correctement.

    edit: pour une seule implémentation ça devrait ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    test: test.o ./list1/list1.o
    	gcc test.o ./list1/list1.o -o test
    test.o : test.c
    	gcc -c -D LIST1 test.c -o test.o
    ./list1/list1.o : ./list1/list1.c ./list1/list1.h
    	gcc -c ./list1/list1.c -o ./list1/list1.o
    et fait attention , avant les "gcc" c'est bien une tabulation et non des espaces .

    re-edit: au fait , quand quelque chose "ne marche pas" n'hésite pas à nous donner l'erreur affiché , ou le comportement si il n'y à pas d'erreur affichée

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Neolex Voir le message
    et fait attention , avant les "gcc" c'est bien une tabulation et non des espaces .
    Oui, je fais bien attention à ça maintenant tellement j'y ai eu droit
    Citation Envoyé par Neolex Voir le message
    re-edit: au fait , quand quelque chose "ne marche pas" n'hésite pas à nous donner l'erreur affiché , ou le comportement si il n'y à pas d'erreur affichée
    Toutes les erreurs affichées me disent que le type n'est pas reconnu, et idem avec tous les noms de fonctions que j'ai créées.

    Mais j'ai trouvé une solution, grâce à tes explications !!

    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
    CC = gcc
    CFLAGS = -Wall -pedantic -std=c99
    OBJECTS_LIST1 = ./list1/list1.o test_list1.o
    OBJECTS_LIST2 = ./list2/list2.o test_list2.o
    OBJECTS_LIST3 = ./list3/list3.o test_list3.o
     
    all : test_list1 test_list2 test_list3
     
    test_list1 : $(OBJECTS_LIST1)
        $(CC) $(CFLAGS) $(OBJECTS_LIST1) -o test_list1
    test_list2 : $(OBJECTS_LIST2)
        $(CC) $(CFLAGS) $(OBJECTS_LIST2) -o test_list2
    test_list3 : $(OBJECTS_LIST3)
        $(CC) $(CFLAGS) $(OBJECTS_LIST3) -o test_list3
     
    ./list1/list1.o : ./list1/list1.h ./list1/list1.c
    ./list2/list2.o : ./list2/list2.h ./list2/list2.c
    ./list3/list3.o : ./list3/list3.h ./list3/list3.c
    test_list1.o : test_list.c
        $(CC) -D_INC_LIST1 $(CFLAGS) -c test_list.c -o test_list1.o
    test_list2.o : test_list.c
        $(CC) -D_INC_LIST2 $(CFLAGS) -c test_list.c -o test_list2.o
    test_list3.o : test_list.c
        $(CC) -D_INC_LIST3 $(CFLAGS) -c test_list.c -o test_list3.o
    Pour chaque exécutable voulu (avec différente implantation), sera créé un fichier .o associé.
    Et ensuite avec les 3 différents fichiers .o je crée 3 exécutables
    Pour le début du fichier test_list.c (avant le main) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef _INC_LIST1
    #include "./list1/list1.h"
    #endif
    #ifdef _INC_LIST2
    #include "./list2/list2.h"
    #endif
    #ifdef _INC_LIST3
    #include "./list3/list3.h"
    #endif
    Merci pour votre aide !!

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

Discussions similaires

  1. code::blocks vs compilation avec Makefile (qmake)
    Par ostralo dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 08/04/2008, 13h39
  2. Erreur de compilation C++ avec Makefile
    Par ChipsterJulien dans le forum C++
    Réponses: 2
    Dernier message: 27/08/2007, 18h27
  3. Compilation avec makefile
    Par troumad dans le forum Systèmes de compilation
    Réponses: 13
    Dernier message: 28/03/2007, 16h58
  4. Objet avec options de compilation dans un makefile
    Par z980x dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 27/09/2006, 07h17
  5. Réponses: 1
    Dernier message: 18/06/2004, 01h12

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