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 :

Où trouver les fonctions précompilés.


Sujet :

Autres éditeurs

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut Où trouver les fonctions précompilés.
    Bonjour, je voudrais savoir comment le linker fait pour trouver dans quel fichier se trouve les fonctions précompilées dont un programme à besoin?

    Par exemple, quand on marque #include <stdio.h> au début d'un fichier, le compilateur sait où trouver le prototype, mais on ne dit pas où se trouve la fonction en elle-même.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _Michel
    je voudrais savoir comment le linker fait pour trouver dans quel fichier se trouve les fonctions précompilées dont un programme à besoin?
    Il suffit de configurer correctement l'éditeur de lien et lui indiquant la ou les bibliothèques utilisées.

    gcc :

    -lc (libc.a généralement implicite)
    -lm (libm.a)

    etc.
    Par exemple, quand on marque #include <stdio.h> au début d'un fichier, le compilateur sait où trouver le prototype, mais on ne dit pas où se trouve la fonction en elle-même.
    Normal. Cette directive concerne le compilateur et non l'éditeur de lien...

    A lire :

    http://emmanuel-delahaye.developpez....htm#production

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    En effet, le compilateur a un répertoire où sont stockées toutes les librairies statiques, mais est-ce qu'à chaque référence externe à une fonction, le linker scanne automatiquement tout le répertoire pour trouver la fonction?

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _Michel
    En effet, le compilateur a un répertoire où sont stockées toutes les librairies statiques, mais est-ce qu'à chaque référence externe à une fonction, le linker scanne automatiquement tout le répertoire pour trouver la fonction?
    Bah, non, j'ai déjà dit que l'éditeur de lien (linker) était configuré avec la liste des bibliothèques utilisées... Je parle mandarin ou quoi ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Non non non, j'ais juste pas bien compris.

    Quand le linker est-il configuré? A son installation ou juste avant le linkage?

    Si c'est à son installation, où trouver cette configuration ?
    Et peut-on la modifier si on rajoute des librairies?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _Michel
    Quand le linker est-il configuré? A son installation ou juste avant le linkage?

    Si c'est à son installation, où trouver cette configuration ?
    Et peut-on la modifier si on rajoute des librairies?
    L'éditeur de liens est configuré soit par l'utilisateur quand il utilise un environnement rustique 'à la ligne de commande' (makefiles, par exemple), ou par son IDE. Par exemple avec Code::Blocks :

    Settings > Compiler > Linker etc.

    Chaque environnement de développement a ses particularités de configuration et de fonctionnement. Ceci n'a rien à voir avec le langage C lui-même.

    http://www.developpez.net/forums/forumdisplay.php?f=65

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    Mais pourtant, avec bcc32 (le compilateur que j'utilise), pour un programme de base comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdio.h>
     
    void main {
        printf ("a");
    }
    on ne fait aucune allusion aux librairies dans le makefile qui peut être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    test.exe: test.obj
            $(CC) $(MFLAGS) -etest.exe test.obj
     
    test.obj: test.c
        $(CC) $(MFLAGS) -c -etest.obj test.c
     
    clean:
        del test.obj
        del test.tds
        del test.exe

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _Michel
    Mais pourtant, avec bcc32 (le compilateur que j'utilise), pour un programme de base comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <stdio.h>
     
    void main {
        printf ("a");
    }
    Horrible !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
     
    int main (void) 
    {
       printf ("a\n");
       return 0;
    }
    on ne fait aucune allusion aux librairies dans le makefile qui peut être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    test.exe: test.obj
            $(CC) $(MFLAGS) -etest.exe test.obj
     
    test.obj: test.c
        $(CC) $(MFLAGS) -c -etest.obj test.c
     
    clean:
        del test.obj
        del test.tds
        del test.exe
    Il est possible que certaines bibliothèques de base soient systématiquement (et implicitement) liées. Je me répète : "Chaque environnement de développement a ses particularités de configuration et de fonctionnement."

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je rajouterais de plus que comme on ne sait pas ce que recouvre $(MFLAGS) on est bien obligé de te croire sur parole..

    Mais de toutes façons pour la bibliothèque C standard (et seulement celle-ci) elle est implicitement liée par défaut : je ne sais pas si c'est valable sous Win, mais sous Linux et Unix, en général, par défaut cela va chercher dans /usr/lib, et tu n'as pas à préciser -lc la plupart du temps.. Mais c'est bon de le préciser quand même.

    Quant aux autres, il est certain qu'il faille les préciser, comme a dit Emmanuel.. Ne serait-ce que -lm pour les fonctions mathématiques..

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    La bibliotheque C est en general incluse par defaut car elle contient _start, le symbole qui appelle main(). C'est une mauvaise idee de faire le lien explicite (-lc) car, selon les compilateurs, d'autres bibliotheques sont aussi necessaires (-lgcc par exemple) et dans un ordre particulier. [Il est encore pire de faire -I/usr/include a la compilation, et gcc se protege contre cela: gcc applique en effet un traitement special aux entetes standards et parcourt les repertoires dans un ordre particulier].
    Tout ceci depend du compilateur, pas des outils utilises par dessus (IDE, Makefiles).

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 217
    Points : 105
    Points
    105
    Par défaut
    A, je vois.
    Moi je compile avec bcc32 (Windows) et quand j'utilise une fonction de la librairie mathématique, il suffit que je marque : "#include <math.h>" au début du fichier sans rien dans le makefile (il y a juste un fichier de configuration dans le répertoire bin du compilateur où il est écrit : -I"c:\c...").
    Mais ça ne veut pas dire que bcc lie automatiquement toutes les librairies contenues dans le répertoire lib?

    Une autre quesion : quand un compilateur lie une librairie, il n'inclue pas les fonctions qui ne sont pas appellées par le programme?

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par _Michel
    A, je vois.
    Moi je compile avec bcc32 (Windows) et quand j'utilise une fonction de la librairie mathématique, il suffit que je marque : "#include <math.h>" au début du fichier sans rien dans le makefile (il y a juste un fichier de configuration dans le répertoire bin du compilateur où il est écrit : -I"c:\c...").
    Mais ça ne veut pas dire que bcc lie automatiquement toutes les librairies contenues dans le répertoire lib?

    Une autre quesion : quand un compilateur lie une librairie, il n'inclue pas les fonctions qui ne sont pas appellées par le programme?
    Encore une fois, rien de tout ça n'a à voir avec le langage C. Les détails propres à ton implémentation sont décrits dans la doc de celle-ci. Je t'ai déjà indiqué le bon forum pour poser ces questions. D'ailleurs, je déplace la discussion.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Une autre quesion : quand un compilateur lie une librairie, il n'inclue pas les fonctions qui ne sont pas appellées par le programme?
    Sauf option particulière, quand tu compiles en statique, le compilateur n'inclut que les fonctions dont il a besoin.
    Quand tu compiles en dynamique, rien n'est inclus puisque le code est dans la librairie dynamique.

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

Discussions similaires

  1. Trouver les fonctions non appelées
    Par KiwiJaune dans le forum Visual Studio
    Réponses: 3
    Dernier message: 19/01/2010, 15h59
  2. Réponses: 11
    Dernier message: 05/12/2008, 11h31
  3. Réponses: 3
    Dernier message: 13/03/2008, 10h40
  4. Où trouver l'aide sur les fonctions de l'API Windows ?
    Par psidonio dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 08/11/2005, 15h28
  5. Réponses: 3
    Dernier message: 19/07/2005, 13h05

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