File C Runtime (CRT) e C++ Standard Library (STL) .lib

Questo articolo elenca i file della libreria .lib di runtime di Microsoft C che è possibile collegare quando si sviluppa l'applicazione e le relative opzioni del compilatore e direttive del preprocessore associate.

Per informazioni sulla distribuzione dei file di runtime C necessari per supportare l'applicazione, vedere Ridistribuzione dei file di Visual C++.

Per informazioni di riferimento sulle API per la libreria di runtime C, vedere Informazioni di riferimento sulla libreria di runtime C.

Nota

L'implementazione di Microsoft della libreria standard C++ viene spesso definita libreria standard STL o Standard. Anche se la libreria standard C++ è il nome ufficiale della libreria come definito in ISO 14882, a causa dell'uso comune di "STL" e "Libreria modelli standard" nei motori di ricerca, vengono usati occasionalmente per semplificare la ricerca della documentazione.

Dal punto di vista storico, "STL" originariamente si riferiva alla Libreria modello standard scritta da Alexander Stepanov. Parti di tale libreria sono state standardizzate nella libreria standard C++. La libreria standard incorpora anche la libreria di runtime ISO C, parti della libreria Boost e altre funzionalità. A volte viene usato "STL" per fare riferimento ai contenitori e alle parti degli algoritmi della libreria standard C++ adattata dalla libreria STL di Stepanov. In questa documentazione la libreria di modelli standard (STL) fa riferimento alla libreria standard C++ nel suo complesso.

File di runtime .lib C

La libreria standard ISO C fa parte della libreria standard C++. Le librerie Visual C++ che implementano la libreria CRT supportano lo sviluppo del codice nativo e il codice nativo e gestito misto. Tutte le versioni della libreria CRT supportano lo sviluppo multithread. La maggior parte delle librerie supporta il collegamento statico, per collegare la libreria direttamente al codice, oppure il collegamento dinamico, in modo che il codice usi file DLL comuni.

In Visual Studio 2015 il CRT è stato sottoposto a refactoring in nuovi file binari. La libreria CRT universale (UCRT) contiene le funzioni e le variabili globali esportate dalla libreria CRT C99 standard. UCRT è ora un componente Windows e viene fornito come parte di Windows 10 e versioni successive. La libreria statica, la libreria di importazione DLL e i file di intestazione per UCRT sono ora disponibili in Windows SDK. Quando si installa Visual C++, il programma di installazione di Visual Studio installa il subset di Windows SDK necessario per usare UCRT. È possibile usare la libreria UCRT in qualsiasi versione di Windows supportata da Visual Studio 2015 e versioni successive. Puoi ridistribuirlo usando vcredist per le versioni supportate di Windows diverse da Windows 10 o versioni successive. Per altre informazioni, vedere Ridistribuzione di file Visual C++.

La tabella seguente elenca le librerie che implementano le librerie UCRT.

Libreria DLL associata Caratteristiche Opzione Direttive per il preprocessore
libucrt.lib None Collega in modo statico la libreria UCRT al codice. /MT _MT
libucrtd.lib None Versione di debug della libreria UCRT per il collegamento statico. Non ridistribuibile. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll Libreria di importazione DLL per la libreria UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll Libreria di importazione DLL per la versione di debug della libreria UCRT. Non ridistribuibile. /MDd _DEBUG, _MT, _DLL

La libreria vcruntime contiene codice specifico dell'implementazione CRT di Visual C++: supporto per la gestione delle eccezioni e il debug, controlli di runtime e informazioni sul tipo, dettagli di implementazione e alcune funzioni della libreria estesa. La versione della libreria vcruntime deve corrispondere alla versione del compilatore in uso.

Questa tabella elenca le librerie che implementano la libreria vcruntime.

Libreria DLL associata Caratteristiche Opzione Direttive per il preprocessore
libvcruntime.lib None Collegata in modo statico al codice. /MT _MT
libvcruntimed.lib None Versione di debug per il collegamento statico. Non ridistribuibile. /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll Libreria di importazione DLL per la libreria vcruntime. /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll Libreria di importazione DLL per la libreria vcruntime di debug. Non ridistribuibile. /MDd _DEBUG, _MT, _DLL

Nota

Quando è stato eseguito il refactoring di UCRT, le funzioni di runtime di concorrenza sono state spostate in concrt140.dll, che è stato aggiunto al pacchetto ridistribuibile C++. Questa DLL è necessaria per i contenitori paralleli di C++ e gli algoritmi, ad esempio concurrency::parallel_for. Inoltre, la libreria standard C++ richiede questa DLL in Windows XP per supportare le primitive di sincronizzazione, perché Windows XP non dispone di variabili di condizione.

Il codice che inizializza la libreria CRT è in una di svariate librerie, a seconda che la libreria CRT sia collegata in modo statico o dinamico, o in codice nativo, gestito o misto. Questo codice gestisce l'avvio della libreria CRT, l'inizializzazione e la chiusura dei dati per thread. È specifico della versione del compilatore usata. Questa libreria è sempre collegata in modo statico, anche quando si usa una libreria UCRT collegata in modo dinamico.

Questa tabella elenca le librerie che implementano l'inizializzazione e la chiusura della libreria CRT.

Libreria Caratteristiche Opzione Direttive per il preprocessore
libcmt.lib Collega in modo statico l'avvio della libreria UCRT nativa nel codice. /MT _MT
libcmtd.lib Collega in modo statico la versione di Debug dell'avvio della libreria CRT nativa. Non ridistribuibile. /MTd _DEBUG, _MT
msvcrt.lib Libreria statica per l'avvio della libreria CRT nativa per l'uso con DLL UCRT e vcruntime. /MD _MT, _DLL
msvcrtd.lib Libreria statica per la versione di debug per l'avvio della libreria CRT nativa da usare con DLL UCRT e vcruntime. Non ridistribuibile. /MDd _DEBUG, _MT, _DLL
msvcmrt.lib Libreria statica per l'avvio della libreria CRT nativa e gestita mista per l'uso con DLL UCRT e vcruntime. /clr
msvcmrtd.lib Libreria statica per la versione di debug dell'avvio della libreria CRT nativa e gestita mista per l'uso con DLL UCRT e vcruntime. Non ridistribuibile. /clr
msvcurt.lib Deprecata Libreria statica per la libreria CRT gestita pure. /clr:pure
msvcurtd.lib Deprecata Libreria statica per la versione di debug della libreria CRT gestita pure. Non ridistribuibile. /clr:pure

Se si collega il programma dalla riga di comando senza un'opzione del compilatore che specifica una libreria di runtime C, il linker userà le librerie CRT collegate staticamente: libcmt.lib, libvcruntime.libe libucrt.lib.

L'uso di una libreria CRT collegata in modo statico implica che tutte le informazioni di stato salvate dalla libreria di runtime C saranno locali in questa istanza della libreria CRT. Ad esempio, se si usa strtok un CRT collegato staticamente, la posizione del strtok parser non è correlata allo strtok stato usato nel codice nello stesso processo (ma in una DLL o EXE diversa) collegata a un'altra istanza del CRT statico. Al contrario, la libreria CRT collegata in modo dinamico condivide lo stato per tutto il codice all'interno di un processo collegato in modo dinamico alla libreria CRT. Questo problema non si applica se si usano le nuove versioni più sicure di queste funzioni; ad esempio, strtok_s non presenta questo problema.

Poiché una DLL compilata collegando a un CRT statico ha uno stato CRT specifico, non è consigliabile collegarsi in modo statico a CRT in una DLL, a meno che le conseguenze non siano comprese e desiderate. Ad esempio, se si chiama _set_se_translator in un eseguibile che carica la DLL collegata al proprio CRT statico, eventuali eccezioni hardware generate dal codice nella DLL non verranno rilevate dal traduttore, ma verranno rilevate eccezioni hardware generate dal codice nel file eseguibile principale.

Se si usa l'opzione del /clr compilatore, il codice verrà collegato a una libreria statica, msvcmrt.lib. La libreria statica fornisce un proxy tra il codice gestito e la libreria CRT nativa. Non è possibile usare CRT ( /MT o /MTd opzioni) collegate in modo statico con /clr. Usare invece le librerie collegate dinamicamente (/MD o /MDd). Le librerie CRT gestite in modalità pure sono deprecate in Visual Studio 2015 e non supportate in Visual Studio 2017.

Per altre informazioni sull'uso di CRT con /clr, vedere Assembly misti (nativi e gestiti).

Per compilare una versione di debug dell'applicazione, è necessario definire il _DEBUG flag e collegare l'applicazione con una versione di debug di una di queste librerie. Per altre informazioni sull'uso delle versioni di debug dei file di libreria, vedere Tecniche di debug CRT.

Questa versione di CRT non è completamente conforme allo standard C99. Nelle versioni precedenti a Visual Studio 2019 versione 16.8 l'intestazione <tgmath.h> non è supportata. In tutte le versioni le CX_LIMITED_RANGE macro e FP_CONTRACT pragma non sono supportate. Alcuni elementi, ad esempio il significato degli identificatori di parametro nelle funzioni I/O standard usano interpretazioni legacy per impostazione predefinita. È possibile usare /Zc le opzioni di conformità del compilatore e specificare le opzioni del linker per controllare alcuni aspetti della conformità della libreria.

File della libreria standard C++ (STL) .lib

Libreria standard C++ Caratteristiche Opzione Direttive per il preprocessore
libcpmt.lib Multithreading, collegamento statico /MT _MT
msvcprt.lib Collegamento dinamico multithreading (libreria di importazione per msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Multithreading, collegamento statico /MTd _DEBUG, _MT
msvcprtd.lib Collegamento dinamico multithreading (libreria di importazione per msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL

Quando si compila una versione di rilascio del progetto, una delle librerie di runtime C di base (libcmt.lib, msvcmrt.lib, msvcrt.lib) è collegata per impostazione predefinita, a seconda dell'opzione del compilatore scelta (multithreading, DLL, /clr). Se si include uno dei file di intestazione della libreria standard C++ nel codice, una libreria standard C++ verrà collegata automaticamente da Visual C++ in fase di compilazione. Ad esempio:

#include <ios>

Per la compatibilità binaria, più file DLL possono essere specificati da una singola libreria di importazione. Gli aggiornamenti della versione possono introdurre file dot.dll, DLL separate che presentano nuove funzionalità della libreria. Ad esempio, Visual Studio 2017 versione 15.6 ha introdotto msvcp140_1.dll per supportare funzionalità di libreria standard più standard senza interrompere l'interfaccia ABI (Application Binary Interface) supportata da msvcp140.dll. La msvcprt.lib libreria di importazione inclusa nel set di strumenti per Visual Studio 2017 versione 15.6 supporta entrambe le DLL e vcredist per questa versione installa entrambe le DLL. Dopo essere stata specificata, una libreria dot.dll ha un ABI fisso e non avrà mai una dipendenza su una libreria dot.dll successiva.

Quali problemi si verificano se un'applicazione usa più di una versione CRT?

Ogni immagine di eseguibile (EXE o DLL) può avere un CRT proprio collegato staticamente o è possibile impostare un collegamento dinamico a un CRT. La versione del CRT inclusa in modo statico o caricata in modo dinamico da una particolare immagine dipende dalla versione degli strumenti e delle librerie con cui è stato creato. Un singolo processo può caricare più immagini di EXE e DLL, ognuna con un CRT proprio. Ognuno di tali CRT potrebbe usare un allocatore diverso, avere layout di struttura interna diversi oppure usare disposizioni di archiviazione differenti. Significa che la memoria allocata, le risorse CRT o le classi passate attraverso un limite dll possono causare problemi nella gestione della memoria, nell'utilizzo statico interno o nell'interpretazione del layout. Ad esempio, se una classe è allocata in una DLL ma viene passata ed eliminata da un'altra, quale deallocatore CRT viene usato? Gli errori causati possono variare dal sottile al immediatamente irreversibile e pertanto il trasferimento diretto di tali risorse è sconsigliato.

È possibile evitare molti di questi problemi usando invece tecnologie ABI (Application Binary Interface), poiché sono progettate per essere stabili e disponibili in versione. Progettare le interfacce di esportazione di DLL per passare le informazioni per valore o per operare su memoria passata dal chiamante anziché allocata in locale e restituita al chiamante. Usare le tecniche di marshalling per copiare dati strutturati tra immagini eseguibili. Incapsulare le risorse in locale e consentire la modifica solo tramite handle o funzioni esposti ai client.

È anche possibile evitare alcuni di questi problemi se tutte le immagini nel processo usano la stessa versione caricata in modo dinamico del CRT. Per assicurarsi che tutti i componenti usino la stessa versione DLL di CRT, compilarli usando l'opzione /MD e usare lo stesso set di strumenti del compilatore e le stesse impostazioni delle proprietà.

Prestare attenzione se il programma passa determinate risorse CRT oltre i limiti della DLL. Le risorse come handle di file, impostazioni locali e variabili di ambiente possono causare problemi, anche quando si usa la stessa versione di CRT. Per altre informazioni sui problemi coinvolti e su come risolverli, vedere Potenziali errori che superano i limiti della DLL.

Vedi anche

Informazioni di riferimento sulla libreria di runtime C
Ridistribuzione di file Visual C++