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 :

creation d'un Makefile


Sujet :

Systèmes de compilation

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Points
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 1
    Par défaut creation d'un Makefile
    J'ai développé un programme C sur Mac OS X avec Xcode. Celui-ci se compose de trois fichiers: main.c, functions.h et functions.c. J'aimerais passer sous linux et créer un Makefile afin de me simplifier la vie. Malheureusement je n'arrive pas à le faire compiler le projet, pourtant j'ai pas hésité à me documenter sur le sujet. A titre d'information, les deux fichiers main.c et functions.c incluent le fichier functions.h. Ce dernier fichier commence comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<stdio.h>
    #include<mysql.h>
    #include<memory.h>
    #include<string.h>
    #include<stdarg.h>
    #include<stdlib.h>
    #include<time.h>
    #include<sys/queue.h>
    #include <libstree.h>
    Mon Makefile est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CC       := gcc
    CFLAGS   := -Wall -lz -lm
    LFLAGS   := -lmysqlclient -L/usr/local/lib/ -lstree
    INCDIR   := -I/usr/include/mysql/ -I/usr/local/include/
     
    all:
    	$(CC) $(CFLAGS) $(IFLAGS) -c functions.c functions.h $(INCDIR)
    	$(CC) $(CFLAGS) $(IFLAGS) -o $@ main.c functions.h $(INCDIR)
     
    clean:
    	rm -f total *.o
    A vrai dire je ne comprend pas ce qui cloche. Le message d'erreur renvoyé est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    gcc: -lz: linker input file unused because linking not done
    gcc: -lm: linker input file unused because linking not done
    /tmp/ccEATgGt.o: In function `main':main.c:(.text+0x4f): undefined reference to `connect_db'
    :main.c:(.text+0x65): undefined reference to `get_consult'
    :main.c:(.text+0x7b): undefined reference to `mysql_query'
    .............
    Qu'est ce qu'il ne vas pas dans mon makefile.

  2. #2
    Membre régulier Avatar de telliam
    Inscrit en
    Octobre 2006
    Messages
    63
    Points
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 71
    Par défaut
    Citation Envoyé par vcastus
    J'ai développé un programme C sur Mac OS X avec Xcode. Celui-ci se compose de trois fichiers: main.c, functions.h et functions.c. J'aimerais passer sous linux et créer un Makefile afin de me simplifier la vie. Malheureusement je n'arrive pas à le faire compiler le projet, pourtant j'ai pas hésité à me documenter sur le sujet. A titre d'information, les deux fichiers main.c et functions.c incluent le fichier functions.h. Ce dernier fichier commence comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<stdio.h>
    #include<mysql.h>
    #include<memory.h>
    #include<string.h>
    #include<stdarg.h>
    #include<stdlib.h>
    #include<time.h>
    #include<sys/queue.h>
    #include <libstree.h>
    Mon Makefile est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CC       := gcc
    CFLAGS   := -Wall -lz -lm
    LFLAGS   := -lmysqlclient -L/usr/local/lib/ -lstree
    INCDIR   := -I/usr/include/mysql/ -I/usr/local/include/
     
    all:
    	$(CC) $(CFLAGS) $(IFLAGS) -c functions.c functions.h $(INCDIR)
    	$(CC) $(CFLAGS) $(IFLAGS) -o $@ main.c functions.h $(INCDIR)
     
    clean:
    	rm -f total *.o
    A vrai dire je ne comprend pas ce qui cloche. Le message d'erreur renvoyé est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    gcc: -lz: linker input file unused because linking not done
    gcc: -lm: linker input file unused because linking not done
    /tmp/ccEATgGt.o: In function `main':main.c:(.text+0x4f): undefined reference to `connect_db'
    :main.c:(.text+0x65): undefined reference to `get_consult'
    :main.c:(.text+0x7b): undefined reference to `mysql_query'
    .............
    Qu'est ce qu'il ne vas pas dans mon makefile.
    faute de frappe je dirais remplace IFLAGS par LFLAGS ca devrait deja aller + loin

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Points
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 1
    Par défaut
    merci mais ca ne fonctionne malheureusement toujours pas. Voici la liste totale 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    gcc: -lz: linker input file unused because linking not done
    gcc: -lm: linker input file unused because linking not done
    gcc: -lmysqlclient: linker input file unused because linking not done
    gcc: -lstree: linker input file unused because linking not done
    /tmp/cc2j0f64.o: In function `main':main.c:(.text+0x4f): undefined reference to `connect_db'
    :main.c:(.text+0x65): undefined reference to `get_consult'
    :main.c:(.text+0x148): undefined reference to `open_file_failed'
    :main.c:(.text+0x3a9): undefined reference to `alloc_failed'
    :main.c:(.text+0x4f4): undefined reference to `get_consult'
    :main.c:(.text+0x5fb): undefined reference to `open_file_failed'
    :main.c:(.text+0x6d0): undefined reference to `get_consult'
    :main.c:(.text+0x714): undefined reference to `alloc_failed'
    :main.c:(.text+0x728): undefined reference to `get_consult'
    :main.c:(.text+0x769): undefined reference to `alloc_failed'
    :main.c:(.text+0x791): undefined reference to `get_consult'
    :main.c:(.text+0x7d2): undefined reference to `alloc_failed'
    :main.c:(.text+0x80c): undefined reference to `open_file_failed'
    :main.c:(.text+0x925): undefined reference to `alloc_failed'
    :main.c:(.text+0x932): undefined reference to `alloc_failed'
    :main.c:(.text+0x93f): undefined reference to `alloc_failed'
    :main.c:(.text+0xd17): undefined reference to `string_get_khipu'
    :main.c:(.text+0x1113): undefined reference to `disconnect_db'
    :main.c:(.text+0x1146): undefined reference to `open_file_failed'
    :main.c:(.text+0x1211): undefined reference to `alloc_failed'
    :main.c:(.text+0x127f): undefined reference to `alloc_failed'
    :main.c:(.text+0x154d): undefined reference to `stringset_duplicate_remover'
    :main.c:(.text+0x155f): undefined reference to `substring_of'
    :main.c:(.text+0x156a): undefined reference to `stringset_print'
    :main.c:(.text+0x15eb): undefined reference to `stringset_duplicate_remover'
    :main.c:(.text+0x1600): undefined reference to `stringset_cleaner'
    :main.c:(.text+0x1612): undefined reference to `substring_of'
    :main.c:(.text+0x161d): undefined reference to `stringset_print'
    collect2: ld returned 1 exit status
    make: *** [all] Error 1
    Toutes ces choses non définies sont des nom des méthodes dont les prototypes sont dans functions.h et l'implémentation de celles-ci dans functions.c.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Points
    1 543
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    all:
    	$(CC) $(CFLAGS) $(LFLAGS) -c functions.c functions.h $(INCDIR)
    	$(CC) $(CFLAGS) $(LFLAGS) -o $@ main.c functions.h $(INCDIR)
    La première ligne compile functions.c en functions.o (le functions.h ne sert à rien au passage, ça ne se compile pas un .h).
    La seconde ligne lie un exécutable à partir de main.c, sachant que gcc est assez malin pour savoir qu'il doit faire un main.o intermédiaire.

    Donc en fait tu ne compiles l'exécutable qu'avec uniquement main.c d'où les erreurs à l'édtion des liens sur les symboles non trouvés.

    Essaye par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    all:
    	$(CC) $(CFLAGS) $(LFLAGS) -o $@ main.c functions.c $(INCDIR)
    Ou bien si tu tiens à expliciter toutes les étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    all:
    	$(CC) $(CFLAGS) -c main.c functions.c $(INCDIR)
    	$(CC) $(LFLAGS) -o $@ main.o functions.o
    Sinon -lm et -lz sont des flags pour le linker donc il faut les mettre dans LFLAGS (le L est pour linker) et non dans CFLAGS (le C est pour compiler) soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CFLAGS   := -Wall
    LFLAGS   := -lmysqlclient -L/usr/local/lib/ -lstree -lz -lm
    MAT.

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Points
    9 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Par défaut
    Bonjour,

    il y a un excellent tutoriel sur le sujet sur ce forum !!! Il est très facile à comprendre et à modifier pour faire exactemen ce que tu veux.
    Sinon, j'ai donné le mien qui est complet sur une discussion du forum.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Points
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 1
    Par défaut
    super, ca marche. Grand merci a toi mat007 et aux autres.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    4
    Points
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 4
    Points : 1
    Par défaut
    Enfin, ca compile mais j'ai un problème d'exécution que je ne comprend:


    ./all: error while loading shared libraries: libstree.so.0: cannot open shared object file: No such file or directory


    Pourtant, quand je regarde mon Makefile, il va bien chercher la librairie dans le dossier /usr/local/lib qui contient les fichiers suivants:

    libstree.a
    libstree.la*
    libstree.so -> libstree.so.0.0.0
    libstree.so.0 -> libstree.so.0.0.0
    libstree.so.0.0.0*

    Ou est le problème...

  8. #8
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Points
    750
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Par défaut
    Citation Envoyé par vcastus
    quand je regarde mon Makefile, il va bien chercher la librairie dans le dossier /usr/local/lib qui contient les fichiers suivants:
    Le Makefile, certes, mais a l'execution ?
    As-tu /usr/local/lib dans ton LD_LIBRARY_PATH ? Sinon rajoute-le.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    46
    Points
    73
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2003
    Messages : 46
    Points : 73
    Par défaut
    Sans vouloir casser le sujet, ca vaut le coup de jeter un oeil a scons pour remplacer les makefile. C'est plus simple et beaucoup plus souple : comme les scripts sont du python, on peut beneficier de toute la puissance de ce langage dans son "Makefile" (appele SConstruct dans le cas de scons)

    http://scons.org/

Discussions similaires

  1. [VB6] Création de composant
    Par Tchetch dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/10/2002, 15h52
  2. [c++ builder] creation de surface sur TPanel
    Par JEG dans le forum DirectX
    Réponses: 7
    Dernier message: 23/09/2002, 23h41
  3. [Kylix] SIGSEGV 11 - creation form
    Par pram dans le forum EDI
    Réponses: 1
    Dernier message: 29/08/2002, 16h24
  4. Creation de fiche dynamique
    Par Mouss26 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/07/2002, 08h56
  5. Creation d une clee dans la registry en VC++
    Par rico27fr dans le forum MFC
    Réponses: 4
    Dernier message: 30/05/2002, 13h36

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