Quelle est la différence entre 1) Préprocesseur,éditeur de liens, 2)fichier d'en-Tête de la bibliothèque? Est ma compréhension correcte?
Bien, jusqu'à ce matin, j'étais complètement perdue entre ces termes. Je suppose que j'ai eu de la différence, je l'espère.
Tout d'abord, la confusion vient du fait que, depuis le préprocesseur comprend déjà les fichiers d'en-tête dans le code qui contient les fonctions, ce que les fonctions de bibliothèque n'a linker lien vers le fichier de l'objet produit par l'assembleur/compilateur? Une partie de la confusion se pose principalement en raison de mon ignorance à propos de la différence entre un fichier d'en-tête et d'une bibliothèque.
Après un peu de googling, et de la pile-débordement (est-ce le terme? :p), j'ai déduit que le fichier d'en-tête contient surtout les déclarations de fonction alors que la mise en œuvre réelle est dans un autre fichier binaire appelé la bibliothèque (je ne suis pas encore 100% sûr à ce sujet).
Donc, supposons que dans le programme suivant:-
#include<stdio.h>
int main()
{
printf("whatever");
return 0;
}
Le préprocesseur comprend le contenu du fichier d'en-tête dans le code. Le compilateur/compilateur+assembleur fait son travail, et puis, finalement, l'éditeur de liens associe ce fichier objet avec un autre objet fichier qui est stocké le chemin printf()
œuvres.
Ai-je raison de ma compréhension? Je suis peut-être loin...donc, pourriez-vous svp m'aider?
Edit: je me suis toujours demandé sur le C++ STL. Elle toujours me troublait à ce qu'il est exactement, une collection de toutes ces en-têtes ou quoi? Maintenant, après avoir lu les réponses, je peux dire que la STL est un fichier de l'objet/quelque chose qui ressemble à un fichier de l'objet?
Et aussi, j'ai pensé lorsque j'ai pu lire les définitions de fonctions de fonctions comme l' pow()
, sqrt()
etc etc. Je voudrais ouvrir les fichiers d'en-tête et de ne rien trouver. Donc, est la définition de la fonction dans la bibliothèque en binaire formulaire illisible?
et enfin un exécutable ou d'une autre bibliothèque est produit.... 😉
Une explication (en particulier pour C, mais le C++ est à peu près la même) peut être trouvé dans mon C tutoriel, dans le chapitre sur les en-têtes: masters-of-the-void.com/book10.htm
OriginalL'auteur Paagalpan | 2012-08-29
Vous devez vous connecter pour publier un commentaire.
D'un fichier source C passe par deux étapes principales, (1) le préprocesseur de la scène où le code source C est traité par le préprocesseur utilitaire qui cherche les directives de préprocesseur et effectue ces actions et (2) la phase de compilation où le traité de code source C est alors effectivement compilé pour produire de l'objet des fichiers de code.
Le préprocesseur est un utilitaire qui n'manipulation de texte. Il prend en entrée un fichier qui contient du texte (généralement de code source C) qui peut contenir des directives de préprocesseur et les sorties d'une version modifiée du fichier par l'application de toutes les directives qui se trouvent à l'entrée de texte pour générer une sortie de texte.
Le fichier n'a pas à être de code source C parce que le préprocesseur est en train de faire la manipulation d'un texte. J'ai vu le C Preprocssor utilisé pour étendre le
make
utilité en permettant preprossor des directives qui doivent être inclus dans un fichier. Le fichier de créer avec le C directives de Préprocesseur est géré par le Préprocesseur C de l'utilitaire et le résultat ensuite introduit dansmake
à faire de la réalisation de la cible.Bibliothèques et de liaison
Une bibliothèque est un fichier qui contient le code de l'objet de diverses fonctions. C'est un moyen de conditionner la sortie de plusieurs fichiers source lorsqu'ils sont compilés dans un seul fichier. Nombre de fois qu'un fichier de bibliothèque est fourni avec un fichier d'en-tête (inclure le fichier), généralement avec un .h l'extension de fichier. L'en-tête du fichier contient les déclarations de fonction, la variable globale de déclarations, ainsi que les directives de préprocesseur nécessaires pour la bibliothèque. Donc, l'usage de la bibliothèque, vous devez inclure le fichier d'en-tête fourni à l'aide de la
#include
directive et de vous lier avec le fichier de la bibliothèque.Une fonctionnalité intéressante d'un fichier de bibliothèque, c'est que vous fournir la version compilée de votre code source et de ne pas le code source lui-même. D'autre part, depuis le fichier de la bibliothèque contient le code source compilé, le compilateur utilisé pour générer le fichier de la bibliothèque doit être compatible avec le compilateur utilisé pour compiler vos propres fichiers de code source.
Il existe deux types de bibliothèques couramment utilisés. La première et plus type est la bibliothèque statique. La deuxième et la plus récente est la dynamique de la bibliothèque (Bibliothèque de liens Dynamiques ou DLL dans Windows et Bibliothèque Partagée ou Linux). La différence entre les deux est lorsque les fonctions de la bibliothèque sont liés à l'exécutable qui utilise le fichier de la bibliothèque.
L'éditeur de liens est un utilitaire qui prend les différents fichiers objets et les fichiers de bibliothèque pour créer le fichier exécutable. Quand un ou global de la fonction ou la variable est utilisée, le fichier source C, une sorte de marqueur est utilisé pour indiquer à l'éditeur de liens que l'adresse de la fonction ou variable doit être insérée à ce point.
Le compilateur C ne connaît ce qui est dans la source, il compile et ne sait pas qu'est-ce que dans d'autres fichiers tels que les fichiers objets ou des bibliothèques. Si l'éditeur de liens de travail consiste à prendre les différents fichiers et bibliothèques d'objets et de faire la finale, les liens entre les parties en remplaçant les marqueurs de connexions. Ainsi, un éditeur de liens est un utilitaire qui "relie" les différents composants, remplacer le marqueur pour une fonction ou une variable dans l'objet de fichiers et les bibliothèques avec un lien vers le code de l'objet qui a été généré pour la fonction globale ou variable.
Au cours de l'éditeur de liens scène, c'est quand la différence entre une bibliothèque statique et dynamique ou la bibliothèque partagée devient évident. Quand une bibliothèque statique est utilisé, le code objet de la bibliothèque est inclus dans l'exécutable de l'application. Lorsqu'une dynamique ou la bibliothèque partagée est utilisée, le code de l'objet inclus dans l'exécutable de l'application est le code pour trouver la bibliothèque partagée et se connecter avec elle lorsque l'application est exécutée.
Dans certains cas, le même nom de fonction peut être utilisé dans plusieurs fichiers objets ou les bibliothèques de sorte que l'éditeur de liens normalement juste d'utiliser la première il vient à travers et émettre un avertissement à propos d'autres ont trouvé.
Résumé de compiler et lier
De sorte que le processus de base pour la compilation et la liaison d'un programme C est:
préprocesseur utilitaire génère le code source en C pour être compilé
compilateur compile le source C en code objet de générer un ensemble de fichiers de l'objet
de l'éditeur de liens liens les différents fichiers de l'objet ainsi que toutes les bibliothèques en fichier exécutable
Ci-dessus est le processus de base, cependant lors de l'utilisation de bibliothèques dynamiques il peut devenir plus compliqué, surtout si une partie de l'application a généré les bibliothèques dynamiques qui génèrent.
Le chargeur
Il y a aussi la scène de quand l'application est en fait chargé dans la mémoire et le démarrage de l'exécution. Un système d'exploitation fournit un utilitaire, le chargeur, qui lit le fichier exécutable de l'application et de la charge en mémoire et ensuite commence l'exécution de l'application. Le point de départ ou point d'entrée pour le fichier exécutable est spécifié dans le fichier exécutable, donc après le chargeur lit le fichier exécutable en mémoire, il va alors démarrer l'exécutable en cours d'exécution en sautant vers le point d'entrée d'adresse de mémoire.
Un problème à l'éditeur de liens peut rencontrer, c'est que, parfois, il peut venir à travers un repère lorsque c'est le traitement de l'objet de fichiers de code qui nécessite une adresse de mémoire. Cependant, l'éditeur de liens ne connaissez pas l'adresse de mémoire parce que l'adresse varient selon l'endroit où dans la mémoire de l'application est chargée. Si l'éditeur de liens marques comme quelque chose pour le chargeur utilitaire pour résoudre quand le chargeur est le chargement de l'exécutable en mémoire et prêt à commencer à courir.
Avec des Processeurs modernes avec du matériel pris en charge adresse virtuelle et adresse physique de la cartographie ou de la traduction, cette question de l'adresse de mémoire est rarement un problème. Chaque application est chargée à la même adresse virtuelle et adresse du matériel de traduction traite avec le réel, l'adresse physique. Cependant, les Processeurs plus anciens ou à faible coût Processeurs tels que des micro-contrôleurs, qui sont dépourvues de l'unité de gestion mémoire (MMU) prise en charge matérielle pour la traduction d'adresse encore besoin de résoudre ce problème.
Points d'entrée et le Runtime C
Un dernier thème est le Runtime C et la
main()
et l'exécutable point d'entrée.Le Runtime C est le code de l'objet fourni par le compilateur fabricant, qui contient le point d'entrée pour une application qui est écrit en C. Le
main()
fonction est le point d'entrée fournies par le programmeur écrit à l'application mais ce n'est pas le point d'entrée du chargeur voit. Lemain()
fonction est appelée par le Runtime C après le démarrage de l'application et de la C Runtime code met en place l'environnement de l'application.Le Runtime C est pas de la Bibliothèque Standard C. Le but de la C Runtime est de gérer l'environnement d'exécution pour l'application. Le but de la Bibliothèque Standard C est de fournir un ensemble de fonctions utilitaires, de sorte qu'un programmeur n'a pas à créer leur propre.
Quand le chargeur charge l'application et saute vers le point d'entrée fournies par le Runtime C, la C Runtime effectue ensuite les différents initialisation mesures nécessaires pour fournir le bon environnement d'exécution pour l'application. Une fois cela fait, le Runtime C, puis appelle la
main()
fonction de façon à ce que le code créé par le développeur de l'application ou du programmeur commence à s'exécuter. Lorsque lemain()
retourne ou lorsque leexit()
fonction est appelée, le Runtime C effectue toutes les actions nécessaires pour nettoyer et fermer l'application.OriginalL'auteur Richard Chambers
C'est un très commun de la source de la confusion. Je pense que la meilleure façon de comprendre ce qui se passe est de prendre un exemple simple. Oubliez les bibliothèques pour un moment et considérer les points suivants:
La déclaration
extern int foo( void )
effectue exactement la même fonction que le fichier d'en-tête d'une bibliothèque.foo.o
est l'exécution de la fonction de la bibliothèque. Si vous comprenez cet exemple, et pourquoi, nicc main.c
nicc main.o
de travail, alors vous comprenez la différence entre les fichiers d'en-tête et les bibliothèques.Il semble que le chat de commande Linux est utilisé pour les deux petits, C très simple fichiers de code source, principal.c et foo.c, qui sont chacune de la première compilation, puis sont liés. La cc de commande dispose de suffisamment d'intelligence, de sorte que si vous spécifiez les fichiers objets, le principal.o et foo.o fichiers, il suffit d'effectuer un lien à l'aide de ces fichiers.
cat
n'est pas de créer les fichiers, affichant simplement.OriginalL'auteur William Pursell
Oui, presque correct. Sauf que l'éditeur de liens n'a pas de liens de fichiers d'objets, mais aussi des bibliothèques - dans ce cas, c'est la bibliothèque C standard (libc) est ce qui est lié à votre fichier objet. Le reste de vos hypothèses semblent être vrai à propos des étapes de compilation + la différence entre un en-tête et d'une bibliothèque.
sauf qu'il ne l'est pas. créé à partir des fichiers de l'objet, mais ce n'est certainement pas un fichier de l'objet lui-même.
les bibliothèques partagées sont souvent considérés comme des fichiers objets dans leur propre droit.
n'avez-vous pas dire les bibliothèques statiques?
non, les bibliothèques partagées. Les bibliothèques statiques sont
ar
archives de la plaine de vieux fichiers de l'objet. Les bibliothèques partagées sont des "objets partagés" les fichiers (.so
extension sur Linux et d'autres systèmes).OriginalL'auteur