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 :

[C linux makefile] question de syntaxe


Sujet :

Systèmes de compilation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [C linux makefile] question de syntaxe
    je suis un débutant en linux.
    Je recherche comment compiler avec un makefile.
    Mes fichiers se trouvent dans des repertoires differents
    par exemple mes *.h se trouve dans un fichier nommé include et mes *.o dans un fichier Lib et enfin mon code source *.c se trouve dans la racine.

    Je cherche donc la syntaxe pour le makefile pour aller chercher tous ces fichiers dans ces differents repertoires.

    voila le makefile que j'ai essayé de faire:

    LIBS = -L/home/lib -lftp

    CC = gcc
    OPT = -O3
    #DEB = -g
    INCF = -I/home/include
    CFLAGS = $(OPT) $(DEB) $(INCF)
    OBJ = essaie.o
    INCLUDE = ftplib.h


    essaie: $(OBJ) $(INCF)
    $(CC) $(OBJ) $(CFLAGS) $(LIBS) -o essaie

    %.o : %.c %.h
    $(CC) -c $<
    essaie.o: essaie.c

    En gros, je dois me servir d'une nouvelle librairie qui gere les commandes ftp. (ftplib.h)

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Deja attention make est tres pointilleu sur la syntaxe et dans ton exemple apres la regle tu dois mettre une tabulation a la ligne en dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    essaie: $(OBJ) $(INCF)
        $(CC) $(OBJ) $(CFLAGS) $(LIBS) -o essaie
    les blanc doiven,t être 1 tabulation imperativement, idem pour toutes le regles !
    je ne comprend pas la derniere regle ? (essai.o: essai.c ) elle est redondante avec celle du dessus me semble t il
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci
    pour la fin :

    %.o : %.c %.h
    $(CC) -c $<
    essaie.o: essaie.c
    je pense que ca servirait s'il y avait plusieurs cibles (d autres objets)
    mais la j avais de faire un makefile de base pour compiler un programme tres simple pour me familiariser avec le makefile

    par contre pour
    LIBS = -L/home/lib -lftp
    est ce que la synthaxe est juste?
    en fait je cherche a utiliser le fichier ftplib.o qui se trouve dans home/lib

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Alors utilise plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LIBS = home/lib/ftplib.o
    car en general l'option -l demande un fichier en .a
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    a vi c'est vrai le lib c'est bien pour le .a

    en fait je cherchais le .a

    mon programme c est tout bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
    #include <ftplib.h> /*( ce .h ne sert pas dans ce programme mais c juste pour voir comment  l utiliser dans le makefile car j en aurai besoin pour un futur programme en C qui aura besoin des commandes pour le FTP)*/
     
    main()
    {
       printf("essaie\n");
       system("pause");
    }
    voila mon makefile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    LIBS 	= -L/home/nicolas/lib -lftp
    CC      = gcc
    OPT	= -O3
    #DEB	= -g
    INCF = -I/home/nicolas/include
    CFLAGS  = $(OPT) $(DEB) $(INCF)
     
    OBJ =  essaie.o
     
    essaie: $(OBJ) 
    	$(CC) $(OBJ) $(CFLAGS)  $(LIBS) -o essaie

    dans ce que j'ai compris pour utiliser les .h (donc avec -I/home/nicolas/include) il n y a pas besoin de mettre le nom des fichiers.h que l'on veut utiliser: le makefile utilisera tous les .h qui se trouve dans le dossiers include.

    pour les .a comme le libftp.a il fait ecrire -L/home/nicolas/lib -lftp et non -L/home/nicolas/lib/libftp.a

    (dis moi si je me trompe)

    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tu as tout compris
    Attention faute de frappe je supose mais :
    -L/home/nicolas/lib/libftp.a ne fonctionne pas dans ce cas la on pourrait mettre tout simplement /home/nicolas/lib/libftp.a : le nom de la llibrairie
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci marc

  8. #8
    Membre habitué

    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 58
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par Ultros
    dans ce que j'ai compris pour utiliser les .h (donc avec -I/home/nicolas/include) il n y a pas besoin de mettre le nom des fichiers.h que l'on veut utiliser: le makefile utilisera tous les .h qui se trouve dans le dossiers include.
    Attention à ne pas tout mélanger...
    Le makefile n'utilise pas les .h : c'est le compilateur qui les utilise...
    Le makefile sert uniquement à lancer des commandes, généralement des commandes de compilation et d'édition de liens, mais pas forcement.
    Comme tu l'as vu (?), le principe est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cible : dépendances
    <tab>commandes
    quand un fichier de dépendances est plus récent que cible, make lancera la commande, qui doit normalement servir à fabriquer cible.
    Donc, pour revenir à ton problème, le compilateur va effectivement chercher les .h dont il a besoin dans les répertoires donnés dans les -I, mais ça ne dit pas au make que essaie.o dont être refait lorsque ftplib.h est modifié...
    Dans ton nouveau makefile, tu as regroupé la compilation et l'édition de lien en une seule commande. Je te conseille de les séparer comme tu l'avais fait au début car tu auras probablement plusieurs fichiers à l'avenir.
    Voilà donc ce que je te suggère :
    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
    LIBS    = -L/home/nicolas/lib -lftp
    CC      = gcc
    OPT   = -O3
    #DEB   = -g
    INCF = -I/home/nicolas/include
    CFLAGS  = $(OPT) $(DEB) $(INCF)
     
    OBJ =  essaie.o
     
    # édition de liens
    essaie: $(OBJ)
    <tab>$(CC) $(OBJ)  $(LIBS) -o essaie 
     
    # dépendances 
    # (il existe une commande pour les générer automatiquement
    #  lorsque ça devient trop lourd à gérer à la main...)
    essaie.o : ftplib.h
     
    # régle générale de compilation
    %.o : %.c 
    <tab>$(CC) $(CFLAGS) -c $< -o $@
    Un détail : quand tu tapes make, sans préciser de cible, il fabrique la première qu'il trouve dans le fichier : ici, essaie. C'est pour cela qu'il est souvent d'usage d'avoir une cible all qu'on laisse au début :
    comme ça, on n'a plus besoin de se préoccuper de l'ordre dans la suite.

    Voilà : j'espère que ça t'aidera
    Bon cougage.

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

Discussions similaires

  1. Debutant - Question de syntaxe "::" seuls devant u
    Par Caille dans le forum Débuter
    Réponses: 3
    Dernier message: 08/02/2006, 15h59
  2. Question de syntaxe
    Par dafalri dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 13/12/2005, 20h57
  3. Connection réseau et Linux des questions
    Par kacedda dans le forum Réseau
    Réponses: 4
    Dernier message: 05/11/2005, 23h29
  4. [XML] Questions de syntaxe
    Par ghohm dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 03/11/2005, 12h08
  5. question sur syntaxe d'une requete
    Par sparis dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/09/2005, 11h58

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