Qu'est-ce que la bibliothèque d'exécution C?


158

Qu'est-ce qu'une bibliothèque d'exécution C et à quoi sert-elle? Je cherchais, Google comme un diable, mais je n'ai rien trouvé de mieux que celui de Microsoft: "La bibliothèque d'exécution Microsoft fournit des routines de programmation pour le système d'exploitation Microsoft Windows. Ces routines automatisent de nombreuses tâches de programmation courantes qui ne sont pas fournies par les langages C et C ++. "

OK, je comprends, mais par exemple, qu'est-ce qu'il y a libcmt.lib? Qu'est ce que ça fait? Je pensais que la bibliothèque standard C faisait partie du compilateur C. L' libcmt.libimplémentation par Windows des fonctions de la bibliothèque standard C fonctionne-t-elle sous win32?

Réponses:


71

Oui, libcmt est (l'une des nombreuses) implémentations de la bibliothèque standard C fournie avec le compilateur de Microsoft. Ils fournissent à la fois des versions "debug" et "release" de trois types de bibliothèques de base: monothread (toujours lié statiquement), multithread lié statiquement et multithread lié dynamiquement (bien que, selon la version du compilateur vous utilisation, certains d'entre eux peuvent ne pas être présents).

Ainsi, dans le nom "libcmt", "libc" est le nom traditionnel (plus ou moins) de la bibliothèque C. Le "mt" signifie "multi-thread". Une version "debug" aurait un "d" ajouté à la fin, donnant "libcmtd".

En ce qui concerne les fonctions qu'il inclut, le standard C (partie 7, si vous vous en souciez) définit un ensemble de fonctions qu'une implémentation conforme (hébergée) doit fournir. La plupart des fournisseurs (y compris Microsoft) ajoutent eux-mêmes diverses autres fonctions (pour la compatibilité, pour fournir des fonctionnalités que les fonctions standard ne traitent pas, etc.) Dans la plupart des cas, il contiendra également un certain nombre de fonctions "internes" utilisées par le compilateur mais pas normalement par l'utilisateur final.

Si vous souhaitez obtenir une liste complète des fonctions de "libcmt" (pour utiliser votre exemple), vous pouvez ouvrir l'une des invites de commande de Visual Studio (sous "Visual Studio Tools", normalement), basculer vers le répertoire où se trouvaient vos bibliothèques installé, et tapez quelque chose comme: lib -list libcmt.libet cela générera une ( longue ) liste des noms de tous les fichiers objets de cette bibliothèque. Ceux-ci ne correspondent pas toujours directement aux noms des fonctions, mais donneront généralement une idée. Si vous voulez regarder un fichier objet particulier, vous pouvez utiliser lib -extractpour extraire un de ces fichiers objet, puis utiliser dumpbin /symbols <object file name>pour trouver quelle (s) fonction (s) est / sont dans ce fichier objet particulier.


37
Vous n'avez pas dit ce qu'est la "bibliothèque d'exécution C" !!
onmyway133

4
@entropy: Bien sûr, cela me ressemble, mais la réponse courte est que c'est un ensemble de fonctions, dont beaucoup (mais pas nécessairement toutes) sont spécifiées dans la partie 7 du standard C.
Jerry Coffin le

3
Cette réponse implique que les bibliothèques C font simplement partie des chaînes d'outils du compilateur. Pas précis.
jiggunjer

@JerryCoffin Question: la strcpyfonction de la bibliothèque standard C, par exemple, aurait-elle son implémentation dans la bibliothèque d'exécution, ou aurait-elle simplement son code dans des fichiers .c normaux?
forumulator

@forumulator: il y aura normalement du code source dans un fichier .c qui sera compilé pour produire la bibliothèque standard proprement dite (le ..dll, lib, .a, .so, ou quoi que ce soit qui s'applique au système que vous utilisez) .
Jerry Coffin

57

Au début, nous devons comprendre ce qu'est une bibliothèque d'exécution; et pensez à ce que cela pourrait signifier par "Microsoft C Runtime Library".

voir: http://en.wikipedia.org/wiki/Runtime_library

J'ai posté la plupart de l'article ici car il pourrait être mis à jour.

Lorsque le code source d'un programme informatique est traduit dans la langue cible respective par un compilateur, cela entraînerait un élargissement extrême du code du programme si chaque commande du programme et chaque appel à une fonction intégrée provoquait la génération sur place. du code de programme complet respectif dans la langue cible à chaque fois. Au lieu de cela, le compilateur utilise souvent des fonctions auxiliaires spécifiques au compilateur dans la bibliothèque d'exécution qui ne sont généralement pas accessibles aux programmeurs d'application. Selon le fabricant du compilateur, la bibliothèque d'exécution contiendra parfois également la bibliothèque standard du compilateur respectif ou y sera contenue.

De plus, certaines fonctions qui peuvent être exécutées uniquement (ou qui sont plus efficaces ou précises) au moment de l'exécution sont implémentées dans la bibliothèque d'exécution, par exemple certaines erreurs de logique, la vérification des limites de tableau, la vérification de type dynamique, la gestion des exceptions et éventuellement des fonctionnalités de débogage. Pour cette raison, certains bogues de programmation ne sont pas découverts tant que le programme n'est pas testé dans un environnement «live» avec des données réelles, malgré une vérification sophistiquée au moment de la compilation et des tests de pré-publication. Dans ce cas, l'utilisateur final peut rencontrer un message d'erreur d'exécution.

Habituellement, la bibliothèque d'exécution réalise de nombreuses fonctions en accédant au système d'exploitation. De nombreux langages de programmation ont des fonctions intégrées qui ne doivent pas nécessairement être réalisées dans le compilateur, mais qui peuvent être implémentées dans la bibliothèque d'exécution. Ainsi, la frontière entre la bibliothèque d'exécution et la bibliothèque standard appartient au fabricant du compilateur. Par conséquent, une bibliothèque d'exécution est toujours spécifique au compilateur et à la plate-forme.

Le concept d'une bibliothèque d'exécution ne doit pas être confondu avec une bibliothèque de programmes ordinaire comme celle créée par un programmeur d'application ou fournie par un tiers ou une bibliothèque dynamique, c'est-à-dire une bibliothèque de programmes liée au moment de l'exécution. Par exemple, le langage de programmation C ne nécessite qu'une bibliothèque d'exécution minimale (communément appelée crt0) mais définit une grande bibliothèque standard (appelée bibliothèque standard C) que chaque implémentation doit fournir.


3
La phrase en surbrillance comme moyen de distinguer de la bibliothèque standard est la première réponse précise et concise que j'ai vue non qualifiée avec «la plupart» ou «parfois».
nik.shornikov

@ nik.shornikov: C'est parce que d'autres descriptions essaient d'être plus précises. Bien qu'il soit vrai qu'une bibliothèque standard est généralement spécifique à un compilateur et à une plate-forme, ce n'est pas toujours vrai. Par exemple, au moins certaines versions du compilateur C ++ de Mingw et d'Intel pour Windows ont utilisé la bibliothèque standard de Microsoft plutôt que de fournir la leur. De même, Clang sur Linux peut être (et est souvent) installé pour utiliser la bibliothèque standard dans une installation existante de gcc plutôt que d'en installer une autre pour elle-même.
Jerry Coffin

Je suis raisonnablement certain qu'il est possible d'écrire des implémentations des bibliothèques standard C et C ++ qui sont portables sur toute plate-forme prenant en charge POSIX.
Jerry Coffin

21

Je me suis juste posé la question moi-même et je me suis fait mal au cerveau pendant quelques heures. Je n'ai toujours rien trouvé qui fasse vraiment un point. Quiconque écrit quelque chose sur un sujet ne peut pas réellement «enseigner». Si vous voulez enseigner à quelqu'un, prenez la langue la plus élémentaire qu'une personne comprend, afin qu'elle n'ait pas besoin de se soucier des autres sujets lors du traitement d'un sujet. Je suis donc parvenu à une conclusion pour moi-même qui semble bien s'intégrer dans tout ce chaos.

Dans le langage de programmation C, chaque programme commence par la main()fonction. D'autres langages peuvent définir d'autres fonctions où le programme démarre. Mais un processeur ne connaît pas le main(). Un processeur ne connaît que les commandes prédéfinies, représentées par des combinaisons de 0et 1.

Dans la programmation par microprocesseur, n'ayant pas de système d'exploitation sous-jacent (Microsoft Windows, Linux, MacOS, ..), vous devez indiquer explicitement au processeur par où commencer en définissant le ProgramCounter(PC) qui itère et saute (boucles, appels de fonction) dans le commandes connues du processeur. Vous devez savoir quelle est la taille de la RAM, vous devez définir la position de la pile de programmes (variables locales), ainsi que la position du tas (variables dynamiques) et l'emplacement des variables globales (je suppose que cela s'appelait SSA ?) dans la RAM. Un seul processeur ne peut exécuter qu'un seul programme à la fois.

C'est là que le système d'exploitation entre en jeu. Le système d'exploitation lui-même est un programme qui s'exécute sur le processeur. Un programme qui permet l'exécution de code personnalisé. Exécute plusieurs programmes à la fois en basculant entre les codes d'exécution des programmes (qui sont chargés dans la RAM). Mais le système d'exploitation EST UN PROGRAMME, chaque programme est écrit différemment. Le simple fait de mettre le code de votre programme personnalisé dans la RAM ne le fera pas fonctionner, le système d'exploitation ne le sait pas. Vous devez appeler des fonctions sur le système d'exploitation qui enregistre votre programme, indiquer au système d'exploitation la quantité de mémoire dont le programme a besoin, où se trouve le point d'entrée dans le programme (lemain()fonction en cas de C). Et c'est ce que je suppose qui se trouve dans la bibliothèque d'exécution, et explique pourquoi vous avez besoin d'une bibliothèque spéciale pour chaque système d'exploitation, car ce ne sont que des programmes eux-mêmes et ont des fonctions différentes pour faire ces choses.

Cela explique également pourquoi il n'est PAS lié dynamiquement au moment de l'exécution car .dll sont les fichiers, même si cela s'appelle une bibliothèque RUNTIME. La bibliothèque d'exécution doit être liée de manière statique, car elle est nécessaire au démarrage de votre programme. La bibliothèque d'exécution injecte / connecte votre programme personnalisé dans / à un autre programme (le système d'exploitation) à RUNTIME. Cela provoque vraiment un cerveau f ...

Conclusion: RUNTIME Library est un échec de dénomination. Il n'y a peut-être pas eu de.dll (liaison au moment de l'exécution) dans les premiers temps et le problème de la compréhension de la différence n'existait tout simplement pas. Mais même si c'est vrai, le nom est mal choisi.

De meilleurs noms pour la bibliothèque d'exécution pourraient être: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

J'espère que j'ai bien compris, pour correction / expansion. à votre santé.


1
Je ne comprends toujours pas l'idée. Pourquoi un programme a-t-il besoin de quelque chose au Runtime? Pourquoi le code binaire ne peut-il pas s'exécuter, à 100% seul, sans que rien ne le supporte au moment de l'exécution? Ou en d'autres termes: est-il possible d'avoir un code qui tourne à 100% sans rien (y compris l'OS)?
MarcioAB

5
En théorie, un programme n'a pas besoin d' un RTL. Cependant, comment votre programme afficherait-il son résultat ou prendrait-il une entrée ou une demande de mémoire sans une coopération du système d'exploitation?
SN du

16

C est un langage et dans sa définition, aucune fonction ne doit être mise à votre disposition. Pas d'E / S, pas de routines mathématiques et ainsi de suite. Par convention, il existe un ensemble de routines disponibles que vous pouvez lier à votre exécutable, mais vous n'avez pas besoin de les utiliser. Cependant, c'est une chose tellement courante à faire que la plupart des éditeurs de liens ne vous demandent plus de créer un lien vers les bibliothèques d'exécution C.

Il y a des moments où vous n'en voulez pas - par exemple, lorsque vous travaillez avec des systèmes embarqués, il peut être peu pratique d'avoir malloc, par exemple. J'avais l'habitude de travailler sur l'intégration de PostScript dans des imprimantes et nous avions notre propre ensemble de bibliothèques d'exécution qui étaient beaucoup plus heureux sur les systèmes embarqués, donc nous ne nous sommes pas préoccupés du "standard".


11
En fait, les normes C décrivent deux types d'environnements C - «autonome» et «hébergé» - et, dans les environnements hébergés, les fonctions décrites dans les normes sont définies comme disponibles. Dans les systèmes embarqués, l'environnement C est généralement autonome, de sorte que vous pouvez ne pas avoir les routines de bibliothèque, ou vous pouvez éviter d'en utiliser et utiliser vos propres remplaçants.

10

La bibliothèque d'exécution est cette bibliothèque qui est automatiquement compilée pour tout programme C que vous exécutez. La version de la bibliothèque que vous utiliseriez dépend de votre compilateur, de votre plate-forme, des options de débogage et des options de multithreading.

Une bonne description des différents choix pour les bibliothèques d'exécution: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Il inclut les fonctions que vous ne pensez normalement pas avoir besoin d'une bibliothèque à appeler:

  • malloc
  • énumération, struct
  • abs, min
  • affirmer

Microsoft a une belle liste de leurs fonctions de bibliothèque d'exécution:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

La liste exacte des fonctions varie en fonction du compilateur, donc pour iOS, vous obtiendrez d'autres fonctions comme dispatch_async () ou NSLog ().


1
Est-ce que struct et enum sont vraiment une bibliothèque d'exécution?
Dean P

6

Si vous utilisez un outil tel que Dependency Walker sur un exécutable compilé à partir de C ou C ++, vous verrez que l'une des DLL dont il dépend est MSVCRT.DLL. Il s'agit de la bibliothèque Microsoft C Runtime. Si vous examinez plus en détail MSVCRT.DLL avec DW, vous verrez que c'est là que toutes les fonctions comme printf (), met (0, gets (), atoi () etc. live.


6
Seulement si lors de la compilation de cet exécutable, le runtime C était lié dynamiquement. S'il était lié statiquement, le marcheur de dépendance affichera rien
Eli Bendersky

4

Je pense que la définition de Microsoft signifie vraiment:

L'implémentation Microsoft de la bibliothèque d'exécution C standard fournit ...


3

Il existe trois formes de la bibliothèque d'exécution C fournie avec le SDK Win32:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

L'édition 32 bits de Microsoft Visual C ++ contient également ces trois formulaires, cependant, le CRT dans une DLL est nommé MSVCRT.LIB. La DLL est redistribuable. Son nom dépend de la version de VC ++ (c'est-à-dire MSVCRT10.DLL ou MSVCRT20.DLL). Notez cependant que MSVCRT10.DLL n'est pas pris en charge sur Win32s, tandis que CRTDLL.LIB est pris en charge sur Win32s. MSVCRT20.DLL est disponible en deux versions: une pour Windows NT et l'autre pour Win32s.

voir: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.