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

Autres éditeurs Discussion :

[debutant]Monde unix : différence entre un fichier .a et .la


Sujet :

Autres éditeurs

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 50
    Points
    50
    Par défaut [debutant]Monde unix : différence entre un fichier .a et .la
    Bonjour,

    J'aimerais savoir quel est la différence entre un fichier ayant comme extension .a et un autre fichier ayant comme extension .la

    Je sais par ailleurs que se sont des librairies statiques (enfin c'est ce que je crois)

    J'aimerai également avoir un point de précision sur ce qu'il se passe lors de la compilation en utilisant une telle librairie (avec l'option -l sous gcc (gnu C compiler pour ceux qui ne connaissent pas !) )

    Peut-on executer le fichier compilé avec cette librairie sur un poste n'ayant pas cette librairie ? par exemple avec une librairie toto la ligne de compilation donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -ltoto monProg.c -o monProg
    Merci d'avance pour vos réponses

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Un fichier *.la je ne crois pas avoir déjà vu mais les *.ac'est sûr, c'est une version statique d'une bibliothèque.
    Pour la compilation en fait rien, c'est au moment de l'édition des liens (lors du passage de ld) que cela joue. Etant donné que c'est une bibliothèque statique, cela veut simplement dire que tout la lib est ajoutée au binaire final du programme, rien de plus donc oui, pas besoin de *.dll ou *.so.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Les .la sont généré par libtool. Il s'agit d'un simple fichier texte contenant différentes informations pour libtool au sujet de la librairie statique du même nom ( le .a ). On retrouve aussi des .lo pour les librairies dynamiques ( .so en général ). Apres leur utilité, je ne sais aps trop, je ne maitrise pas bien libtool.

    Si tu veux faire une compilation statique, il faut utiliser la syntaxe suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc ta_lib. ta_lib2.a .. truc.o truc2.o -o truc

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    N'y as t'il pas un autre moyen d'utiliser une librairie statique ?

    En consultant la documentation de gcc et après avoir vu diverses compilation de logiciel open source j'ai remarqué qu'il est possible d'utiliser les options :
    -Lrepertoire et -lnomDeLaLibrairie

    Or j'ai voullu faire un test avec 3 fichiers (mais ça ne marche pas) :

    Le premier : en-tete.h définie les fonctions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef _ENTETE_
    #define _ENTETE_
    #include <stdio.h>
    int arr(double);
    void releve (char a[128], double *z, double *e ,int *r);
    int entree (void);
    void calcul(double *a , double z , double e , double *r , int *t );
    void sortie (double a, int b, int flag) ;
    #endif
    La première question que je me pose : Ne faut-il pas déclarer toute ses fonctions EXTERN, car elles sont définies dans un autre fichiers (à savoir coprs.c qui sera l'unique objet de notre librairie) ??

    Ensuite il y a le fichier corps.c :
    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
     
    #include "entete.h"
     
    #define zero -273.15
     
    int arr(double a)
    {
      return ( (int) a + 0.5 );
    }
     
     
    int entree (void)
    {
      /* implementation de entree */
    }
     
     
    void releve (char l[128], double *a1, double *a2,int *b)
    {
       /* implementation de releve */
    }
     
     
    void calcul(double *Max,double tempmax, double tempmin, double *ecart, int *N)
    {
        /* Implementation de calcul */
    }
     
     
    void sortie (double a, int b, int flag)
    {
       /* implémentation de sortie */
    }
    et enfin le fichier temperature.c (qui contient le main) :
    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
     
    #include "entete.h"
    #define zero -273.15
     
    int main(void)
    {
      double TMax = zero, ecartmax = -1, tempmax, tempmin;
      int nblieumax = 0, drap = 1, k = 0;
      char lieu[128];
     
      while (drap == 1)
      {
        ++k;
        releve (lieu,&tempmax,&tempmin,&drap);
        if ( drap == 1)
          calcul(&TMax,tempmax,tempmin,&ecartmax,&nblieumax);
      }
      if (k != 1)
      {
        drap = 1 ;
        sortie(ecartmax,nblieumax,drap);
      }
      else
      {
        drap = 0 ;
        sortie(ecartmax,nblieumax,drap);
      }
      return 0;
    }
    Ensuite lors de la compilation j'effectue les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    gcc -Wall -ansi -pendantic -c corps.c -o corps.o
    gcc -Wall -ansi -pendantic -c temperature.c -o temperature.o
    ar -rvu libcorps.a corps.o (j'ai essayé aussi : ar -q libcorps.a corps.o)
     
    ranlib libcorps.a
     
    gcc -I. -L. -lcorps temperature.o -o temperature
    Mais j'ai une erreur lors de l'édition des liens : le compilateur me dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /cygdrive/c/DOCUME~1/Nicolas/LOCALS~1/Temp/cc6TVFOF.o:temperature.c:(.text+0x90)
    : undefined reference to `_releve'
    /cygdrive/c/DOCUME~1/Nicolas/LOCALS~1/Temp/cc6TVFOF.o:temperature.c:(.text+0xbd)
    : undefined reference to `_calcul'
    /cygdrive/c/DOCUME~1/Nicolas/LOCALS~1/Temp/cc6TVFOF.o:temperature.c:(.text+0xe5)
    : undefined reference to `_sortie'
    /cygdrive/c/DOCUME~1/Nicolas/LOCALS~1/Temp/cc6TVFOF.o:temperature.c:(.text+0x107
    ): undefined reference to `_sortie'
    collect2: ld returned 1 exit status
    Je ne comprends pas d'où l'erreur viens !!

    J'espère que quelqu'un pourra m'aider !

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    C'est bon je viens de trouver moi-même la réponse au problème posé !

    En fait c'est tout simple mais il faut le savoir, sinon on galère (pendant 2 jours ! :S)

    en fait la ligne de commande est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc temperature.c -L. -lcorps -o temperature
    Il faut d'abord mettre le fichier qui necessite les fonctions (ici tempeature.c, et ensuite le fichier qui fourni les fonctions (la librairie) !!)

    Voilà, j'espère que cela pourra en aider d'autres !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/07/2011, 17h25
  2. Outils sur les différences entre deux fichiers XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 19
    Dernier message: 21/07/2008, 15h21
  3. Différence entre les fichiers et les files
    Par amine6441 dans le forum Langage
    Réponses: 1
    Dernier message: 14/01/2007, 09h59
  4. Différence entre deux fichiers
    Par Celelibi dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 17h36
  5. Réponses: 5
    Dernier message: 17/05/2004, 15h29

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