web-dev-qa-db-fra.com

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

Qu'est-ce qu'une bibliothèque d'exécution C et à quoi sert-elle? Je cherchais Google comme un diable, mais je ne trouvais rien de mieux que celui de Microsoft: "La bibliothèque d’exécution de 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 ça, mais par exemple, ce qui est dans libcmt.lib? Qu'est ce que ça fait? Je pensais que la bibliothèque standard C faisait partie du compilateur C. Ainsi est libcmt.lib L'implémentation par Windows des fonctions de la bibliothèque standard C pour fonctionner sous win32?

144

Oui, libcmt est l'une des implémentations de la bibliothèque standard C fournie avec le compilateur de Microsoft. Ils fournissent à la fois les versions "debug" et "release" de trois types de bibliothèques de base: single-threaded (toujours lié statiquement), multi-threaded lié statiquement, et - multi-threaded dynamiquement lié (cependant, selon la version du compilateur que vous utilisez, certaines peuvent ne pas être présentes).

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

En ce qui concerne les fonctions qu’il inclut, la norme C (partie 7, si vous en tenez compte) 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 des raisons de compatibilité, afin de fournir des fonctionnalités que les fonctions standard n'abordent pas, etc.). Dans la plupart des cas, il contiendra également quelques fonctions "internes" utilisées par le compilateur. mais pas normalement par l'utilisateur final.

Si vous souhaitez obtenir une liste complète des fonctions dans "libcmt" (pour utiliser votre exemple), vous pouvez ouvrir l'une des invites de commande Visual Studio (sous "Visual Studio Tools", normalement), puis basculez vers le répertoire où se trouvaient vos bibliothèques. installé et tapez quelque chose comme: lib -list libcmt.lib et il générera une liste ( longue ) des noms de tous les fichiers objet de cette bibliothèque. Celles-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 -extract pour extraire un de ces fichiers objet, utilisez ensuite `dumpbin/symboles" pour rechercher la ou les fonctions qui sont/sont dans ce fichier objet particulier.

63
Jerry Coffin

Au début, nous devrions 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 compilateur traduit le code source d'un programme informatique dans la langue cible respective, cela entraînerait un agrandissement extrême du code du programme si chaque commande du programme et chaque appel à une fonction intégrée entraînait la génération en place. du code de programme respectif complet 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, pour la plupart, ne sont pas accessibles aux programmeurs d'applications. En fonction du fabricant du compilateur, la bibliothèque d'exécution contient parfois également la bibliothèque standard du compilateur respectif ou est contenue dans celle-ci.

De plus, certaines fonctions pouvant uniquement être exécutées (ou plus efficaces ou plus 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 du 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 "en direct" avec des données réelles, malgré une vérification sophistiquée au moment de la compilation et des tests préliminaires. 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 peuvent être implémentées dans la bibliothèque d'exécution. La frontière entre la bibliothèque d'exécution et la bibliothèque standard appartient donc 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 de bibliothèque d'exécution ne doit pas être confondu avec une bibliothèque de programme ordinaire telle que celle créée par un programmeur d'application ou livrée par un tiers ou une bibliothèque dynamique, ce qui signifie une bibliothèque de programme 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.

50
fantagons

Je viens de le demander moi-même et me faisais mal au cerveau pendant quelques heures. Toujours n'a rien trouvé qui fait vraiment un point. Tous ceux qui écrivent quelque chose sur un sujet ne peuvent pas réellement "enseigner". Si vous voulez enseigner à quelqu'un, prenez le langage le plus élémentaire qu'une personne comprend, afin qu'il n'ait pas à se préoccuper d'autres sujets lorsqu'il traite un sujet. Je suis donc parvenu à une conclusion qui semble bien s’intégrer dans tout ce chaos.

Dans le langage de programmation C, chaque programme commence par la fonction main (). D'autres langues peuvent définir d'autres fonctions à partir desquelles le programme démarre. Mais un processeur ne sait pas main (). Un processeur ne connaît que des commandes prédéfinies, représentées par des combinaisons de "0" et "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 ProgrammCounter (PC) qui itère et saute (boucles, appels de fonction) dans les commandes connues du processeur. Vous devez connaître la taille de la RAM, vous devez définir la position de la pile de programmes (variables locales), ainsi que la position du segment de mémoire (variables dynamiques) et l'emplacement de la pile. variables globales (par exemple, SSA?) dans la RAM: un seul processeur ne peut exécuter qu'un 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 IS UN PROGRAMME, chaque programme est écrit différemment. Il suffit de mettre le code de votre programme personnalisé dans RAM ne l'exécutera pas, le système d'exploitation Vous devez appeler les fonctions du système d’exploitation qui enregistre votre programme, lui indiquer la quantité de mémoire dont le programme a besoin, le point d’entrée dans le programme (la fonction main () en cas de C). Et c’est ce que je trouve qui se trouve dans RuntimeLibrary, et explique pourquoi vous avez besoin d’une bibliothèque spéciale pour chaque système d’exploitation, car ils ne font que se programmer et ont des fonctions différentes pour le faire.

Cela explique également pourquoi il N'EST PAS lié dynamiquement au moment de l'exécution comme le sont les fichiers .dll, même s'il s'appelle RUNTIMELibrary. La RuntimeLibrary doit être liée statiquement, car elle est nécessaire au démarrage de votre programme. RuntimeLibrary injecte/connecte votre programme personnalisé à/à un autre programme (le système d'exploitation) à RUNTIME. Cela provoque vraiment un peu de cerveau ...

Conclusion: RUNTIMELibrary est un échec dans la dénomination. Peut-être n'y a-t-il pas eu .dll (liaison au moment de l'exécution) au tout début et la question de la compréhension de la différence n'existait tout simplement pas. Mais même si cela est vrai, le nom est mal choisi.

Les meilleurs noms pour RuntimeLibrary pourraient être: StartupLibrary/OSEntryLibrary/SystemConnectLibrary/OSConnectLibrary

espère que je me suis bien fait, pour correction/expansion acclamations.

16
Rumble

C est un langage et dans sa définition, il n’est pas nécessaire de disposer de fonctions. Pas d'E/S, pas de routines de calcul, etc. Par convention, vous disposez d'un ensemble de routines que vous pouvez relier à votre exécutable, mais vous n'avez pas besoin de les utiliser. C’est cependant une chose si courante à faire que la plupart des linkers ne vous demandent plus de vous connecter aux bibliothèques d’exécution C.

Il arrive parfois que vous n'en vouliez pas - par exemple, lorsque vous travaillez avec des systèmes intégrés, il peut s'avérer 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 heureuses sur les systèmes embarqués. Nous ne nous sommes donc pas préoccupés du "standard".

14
plinth

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, de vos options de débogage et de vos options 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 considérez pas normalement comme nécessitant l’appel d’une bibliothèque:

  • malloc
  • enum, struct
  • abs, min
  • affirmer

Microsoft a une liste de Nice 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. Ainsi, pour iOS, vous obtiendrez d'autres fonctions telles que dispatch_async () ou NSLog ().

9
arinmorf

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. C'est la bibliothèque Microsoft C Runtime. Si vous examinez plus avant MSVCRT.DLL avec DW, vous verrez que toutes les fonctions telles que printf (), met (0, gets (), atoi (), etc. vivent.

6
anon

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

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

4
Andrey

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 formes. Toutefois, le CRT dans un DLL s'appelle MSVCRT.LIB. Le DLL est redistribuable. Son nom dépend de la version de VC++ (c.-à-d. MSVCRT10.DLL ou MSVCRT20.DLL). Veuillez noter que MSVCRT10.DLL n'est pas pris en charge sur Win32s, alors 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

1
Michael

alors ... je n'ai pas compris ... Est-ce que la bibliothèque d'exécution C est la bibliothèque standard C ou non? Je pense que la bibliothèque Microsoft C Runtime inclut l’implémentation de toute la bibliothèque C standard (ANSI?), Ainsi que des fonctions spécifiques de Microsoft qui étendent la bibliothèque standard.

0
nonlinearly