Cos'è la libreria di runtime C?


158

Che cosa è in realtà una libreria di runtime C ea cosa serve? Stavo cercando su Google come un diavolo, ma non sono riuscito a trovare niente di meglio di quello di Microsoft: "La libreria di runtime di Microsoft fornisce routine per la programmazione per il sistema operativo Microsoft Windows. Queste routine automatizzano molte attività di programmazione comuni che non sono fornite da i linguaggi C e C ++. "

OK, ho capito, ma per esempio, cosa c'è dentro libcmt.lib? Che cosa fa? Ho pensato che la libreria standard C fosse una parte del compilatore C. Quindi libcmt.libl'implementazione di Windows delle funzioni di libreria C standard funziona sotto win32?

Risposte:


71

Sì, libcmt è (una delle diverse) implementazioni della libreria standard C fornita con il compilatore di Microsoft. Forniscono entrambe le versioni "debug" e "release" di tre tipi base di librerie: single-thread (sempre staticamente collegato), multi-thread staticamente collegato e multi-thread collegato dinamicamente (anche se, a seconda della versione del compilatore che si sta utilizzando, alcuni di questi potrebbero non essere presenti).

Quindi, nel nome "libcmt", "libc" è il nome (più o meno) tradizionale per la libreria C. "Mt" significa "multi-thread". Una versione "debug" avrebbe una "d" aggiunta alla fine, dando "libcmtd".

Per quanto riguarda le funzioni che include, lo standard C (parte 7, se ti interessa) definisce un insieme di funzioni che un'implementazione conforme (ospitata) deve fornire. La maggior parte dei fornitori (incluso Microsoft) aggiunge varie altre funzioni (per compatibilità, per fornire funzionalità che le funzioni standard non affrontano, ecc.) Nella maggior parte dei casi, conterrà anche alcune funzioni "interne" utilizzate dal compilatore ma non normalmente dall'utente finale.

Se si desidera ottenere un elenco completo delle funzioni in "libcmt" (per usare il proprio esempio) è possibile aprire uno dei prompt dei comandi di Visual Studio (in "Strumenti di Visual Studio", normalmente), passare alla directory in cui si trovavano le librerie installato e digita qualcosa del tipo: lib -list libcmt.libe genererà un ( lungo ) elenco dei nomi di tutti i file oggetto in quella libreria. Questi non corrispondono sempre direttamente ai nomi delle funzioni, ma generalmente daranno un'idea. Se si desidera esaminare un determinato file oggetto, è possibile utilizzare lib -extractper estrarre uno di quei file oggetto, quindi utilizzare dumpbin /symbols <object file name>per trovare quali funzioni sono / sono in quel particolare file oggetto.


37
Non hai detto che cos'è la "libreria di runtime C" !!
onmyway133

4
@entropia: certo mi sembra come ho fatto io, ma la risposta breve è che è una raccolta di funzioni, molte (ma non necessariamente tutte) specificate nella parte 7 dello standard C.
Jerry Coffin

3
Questa risposta implica che le librerie C sono solo una parte delle toolchain del compilatore. Non preciso.
jiggunjer,

@JerryCoffin Domanda: così la strcpyfunzione della libreria standard C, ad esempio, avrebbe la sua implementazione nella libreria di runtime o avrebbe solo il suo codice nei normali file .c?
Forumulator

@forumulator: normalmente ci sarà un codice sorgente in un file .c che viene compilato per produrre la libreria standard corretta (il file ..dll, lib, .a, .so o qualunque cosa accada al sistema che stai usando) .
Jerry Coffin,

57

All'inizio, dovremmo capire cos'è una libreria di runtime; e pensa a cosa potrebbe significare "Microsoft C Runtime Library".

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

Ho pubblicato la maggior parte dell'articolo qui perché potrebbe essere aggiornato.

Quando un codice compilatore traduce il codice sorgente di un programma per computer nella rispettiva lingua di destinazione, causerebbe un ingrandimento estremo del codice del programma se ogni comando nel programma e ogni chiamata a una funzione incorporata causasse la generazione sul posto del rispettivo codice di programma completo nella lingua di destinazione ogni volta. Invece il compilatore utilizza spesso funzioni ausiliarie specifiche del compilatore nella libreria di runtime che non sono per lo più accessibili ai programmatori dell'applicazione. A seconda del produttore del compilatore, la libreria di runtime a volte conterrà anche la libreria standard del rispettivo compilatore o sarà contenuta in essa.

Inoltre alcune funzioni che possono essere eseguite solo (o più efficienti o accurate) in fase di runtime sono implementate nella libreria di runtime, ad esempio alcuni errori logici, controllo dei limiti dell'array, controllo dinamico dei tipi, gestione delle eccezioni e possibilmente funzionalità di debug. Per questo motivo, alcuni bug di programmazione non vengono scoperti fino a quando il programma non viene testato in un ambiente "live" con dati reali, nonostante sofisticati controlli in fase di compilazione e test pre-release. In questo caso, l'utente finale potrebbe riscontrare un messaggio di errore di runtime.

Di solito la libreria di runtime realizza molte funzioni accedendo al sistema operativo. Molti linguaggi di programmazione hanno funzioni integrate che non devono necessariamente essere realizzate nel compilatore, ma possono essere implementate nella libreria di runtime. Quindi il confine tra la libreria di runtime e la libreria standard dipende dal produttore del compilatore. Pertanto una libreria di runtime è sempre specifica del compilatore e specifica della piattaforma.

Il concetto di libreria di runtime non deve essere confuso con una normale libreria di programmi come quella creata da un programmatore dell'applicazione o fornita da una libreria di terzi o dinamica, ovvero una libreria di programmi collegata in fase di esecuzione. Ad esempio, il linguaggio di programmazione C richiede solo una libreria di runtime minima (comunemente chiamata crt0) ma definisce una libreria standard di grandi dimensioni (chiamata libreria standard C) che ogni implementazione deve fornire.


3
La frase evidenziata come un modo per distinguersi dalla libreria standard è la prima risposta concisa e accurata che non ho visto qualificata con "most" o "a volte".
nik.shornikov

@ nik.shornikov: Questo perché altre descrizioni cercano di essere più accurate. Anche se è vero che una libreria standard è in genere specifica per un compilatore e una piattaforma, non è sempre vero. Solo per esempio, almeno alcune versioni di Mingw e del compilatore C ++ di Intel per Windows hanno utilizzato la libreria standard di Microsoft anziché fornire la propria. Allo stesso modo, Clang su Linux può essere (e spesso è) installato per usare la libreria standard in un'installazione esistente di gcc piuttosto che installarne un'altra per sé.
Jerry Coffin,

Sono ragionevolmente certo che è possibile scrivere implementazioni delle librerie standard C e C ++ che sono portatili su qualsiasi piattaforma che supporti POSIX.
Jerry Coffin,

21

L'ho chiesto a me stesso e mi sono fatto male al cervello per alcune ore. Non ho ancora trovato nulla che abbia davvero senso. Chiunque scriva qualcosa su un argomento non è in grado di "insegnare". Se vuoi insegnare a qualcuno, prendi la lingua più elementare che una persona capisce, quindi non ha bisogno di occuparsi di altri argomenti durante la gestione di un argomento. Quindi sono giunto a una conclusione per me stesso che sembra adattarsi bene a tutto questo caos.

Nel linguaggio di programmazione C, ogni programma inizia con la main()funzione. Altre lingue potrebbero definire altre funzioni da cui parte il programma. Ma un processore non conosce il main(). Un processore conosce solo comandi predefiniti, rappresentati da combinazioni di 0e 1.

Nella programmazione a microprocessore, non avendo un sistema operativo sottostante (Microsoft Windows, Linux, MacOS, ..), è necessario indicare esplicitamente al processore da dove iniziare impostando il ProgramCounter(PC) che itera e salta (loop, chiamate di funzione) all'interno del comandi noti al processore. Devi sapere quanto è grande la RAM, devi impostare la posizione dello stack del programma (variabili locali), nonché la posizione dell'heap (variabili dinamiche) e la posizione delle variabili globali (immagino che si chiamasse SSA ?) all'interno della RAM. Un singolo processore può eseguire un solo programma alla volta.

È qui che entra in gioco il sistema operativo. Il sistema operativo stesso è un programma che viene eseguito sul processore. Un programma che consente l'esecuzione di codice personalizzato. Esegue più programmi alla volta alternando i codici di esecuzione dei programmi (che vengono caricati nella RAM). Ma il sistema operativo È UN PROGRAMMA, ogni programma è scritto in modo diverso. Semplicemente inserendo il codice del tuo programma personalizzato nella RAM non lo eseguirai, il sistema operativo non lo conosce. Devi chiamare le funzioni sul sistema operativo che registra il tuo programma, dire al sistema operativo quanta memoria ha bisogno il programma, dove si trova il punto di ingresso nel programma (ilmain()funzione in caso di C). E questo è ciò che suppongo si trovi all'interno della libreria di runtime e spiega perché è necessaria una libreria speciale per ciascun sistema operativo, perché questi sono solo programmi stessi e hanno funzioni diverse per fare queste cose.

Questo spiega anche perché NON è collegato dinamicamente in fase di esecuzione come lo .dllsono i file, anche se si chiama RUNTIME Library. La libreria di runtime deve essere collegata staticamente, poiché è necessaria all'avvio del programma. La libreria di runtime inietta / collega il programma personalizzato in / a un altro programma (il sistema operativo) in RUNTIME. Questo provoca davvero un po 'di cervello ...

Conclusione: la libreria RUNTIME ha esito negativo nella denominazione. Potrebbe non esserci stato un .dll(collegamento in fase di esecuzione) nei primi tempi e la questione della comprensione della differenza semplicemente non esisteva. Ma anche se questo è vero, il nome è scelto male.

I nomi migliori per la libreria di runtime potrebbero essere: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Spero di aver capito bene, per correzione / espansione. Saluti.


1
Ancora non capisco l'ideia. Perché un programma ha bisogno di qualcosa in Runtime? Perché il codice binario non può essere eseguito, al 100% da solo, senza nulla che lo supporti in fase di esecuzione? O in altre parole: è possibile avere un codice che funziona al 100% senza nulla (incluso il sistema operativo)?
MarcioAB,

5
In teoria un programma non ha bisogno di un RTL. Tuttavia, come potrebbe mai il tuo programma visualizzare il suo risultato o prendere qualsiasi input o richiedere memoria senza una certa collaborazione dal sistema operativo?
SN

16

C è un linguaggio e nella sua definizione non è necessario che vi siano funzioni disponibili. Nessun IO, nessuna routine matematica e così via. Per convenzione, è disponibile una serie di routine che è possibile collegare al file eseguibile, ma non è necessario utilizzarle. Questa è, tuttavia, una cosa così comune da fare che la maggior parte dei linker non ti chiedono più di collegarti alle librerie di runtime C.

Ci sono momenti in cui non li vuoi - ad esempio, lavorando con i sistemi embedded, potrebbe non essere pratico avere malloc, per esempio. Lavoravo per incorporare PostScript nelle stampanti e avevamo il nostro set di librerie di runtime che erano molto più felici sui sistemi embedded, quindi non ci siamo preoccupati dello "standard".


11
In realtà, gli standard C descrivono due tipi di ambienti C - "indipendente" e "ospitato" - e, negli ambienti ospitati, le funzioni descritte negli standard sono definite disponibili. Nei sistemi embedded, l'ambiente C è in genere indipendente, quindi potresti non avere le routine di libreria o potresti essere in grado di evitare di usarne alcune e utilizzare i tuoi sostituti.

10

La libreria di runtime è quella libreria che viene automaticamente compilata per qualsiasi programma C eseguito. La versione della libreria da utilizzare dipende dal compilatore, dalla piattaforma, dalle opzioni di debug e dalle opzioni di multithreading.

Una buona descrizione delle diverse scelte per le librerie di runtime: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Include le funzioni che normalmente non si ritiene abbiano bisogno di una libreria per chiamare:

  • malloc
  • enum, struct
  • abs, min
  • asserire

Microsoft ha un bel elenco delle loro funzioni di libreria di runtime:

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

L'elenco esatto delle funzioni varierebbe a seconda del compilatore, quindi per iOS otterrai altre funzioni come dispatch_async () o NSLog ().


1
Struct and enum è davvero una libreria di runtime?
Decano P

6

Se usi uno strumento come Dependency Walker su un eseguibile compilato da C o C ++, vedrai che una delle DLL da cui dipende è MSVCRT.DLL. Questa è la libreria Microsoft C Runtime. Se esaminerai ulteriormente MSVCRT.DLL con DW, vedrai che è qui che vivono tutte le funzioni come printf (), put (0, gets (), atoi () ecc.


6
Solo se durante la compilazione dell'eseguibile, il runtime C è stato collegato in modo dinamico. Se è stato collegato staticamente, il walker delle dipendenze mostrerà nothiing
Eli Bendersky,

4

penso che la definizione di Microsoft significhi davvero:

L'implementazione Microsoft della libreria runtime C standard fornisce ...


3

Esistono tre forme della libreria di runtime C fornita con l'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'edizione a 32 bit di Microsoft Visual C ++ contiene anche questi tre moduli, tuttavia il CRT in una DLL è denominato MSVCRT.LIB. La DLL è ridistribuibile. Il suo nome dipende dalla versione di VC ++ (ovvero MSVCRT10.DLL o MSVCRT20.DLL). Si noti tuttavia che MSVCRT10.DLL non è supportato su Win32s, mentre CRTDLL.LIB è supportato su Win32s. MSVCRT20.DLL è disponibile in due versioni: una per Windows NT e l'altra per Win32s.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.