Funzionalità libreria CRTCRT Library Features

Questo argomento descrive i vari file lib che formano le librerie di runtime C, nonché le opzioni del compilatore associate e le direttive del preprocessore.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

Librerie di runtime C (CRT)C Run-Time Libraries (CRT)

La libreria di runtime C (CRT) fa parte della libreria standard C++ che incorpora la libreria standard ISO C99.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. Le librerie Visual C++ che implementano la libreria CRT supportano lo sviluppo del codice nativo e il codice nativo e gestito misto.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. Tutte le versioni della libreria CRT supportano lo sviluppo multithread.All versions of the CRT support multi-threaded development. 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.Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

A partire da Visual Studio 2015 la libreria CRT è stata sottoposta a refactoring in nuovi file binari.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. La libreria CRT universale (UCRT) contiene le funzioni e le variabili globali esportate dalla libreria CRT C99 standard.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. La libreria UCRT è ora un componente di Windows ed è inclusa in Windows 10.The UCRT is now a Windows component, and ships as part of Windows 10. La libreria statica, la libreria di importazione DLL e i file di intestazione per la libreria UCRT si trovano ora in Windows 10 SDK.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. Quando si installa Visual C++, Visual Studio installato il subset di Windows 10 SDK richiesto per usare la libreria UCRT.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. È possibile usare la libreria UCRT in qualsiasi versione di Windows supportata da Visual Studio 2015 e versioni successive.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. È possibile ridistribuirla usando vcredist per le versioni supportate di Windows diverse da Windows 10.You can redistribute it using vcredist for supported versions of Windows other than Windows 10. Per altre informazioni, vedere Redistributing Visual C++ Files.For more information, see Redistributing Visual C++ Files.

La tabella seguente elenca le librerie che implementano le librerie UCRT.The following table lists the libraries that implement the UCRT.

LibreriaLibrary DLL associataAssociated DLL CaratteristicheCharacteristics OpzioneOption Direttive per il preprocessorePreprocessor directives
libucrt.liblibucrt.lib nessunoNone Collega in modo statico la libreria UCRT al codice.Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib nessunoNone Versione di debug della libreria UCRT per il collegamento statico.Debug version of the UCRT for static linking. Non ridistribuibile.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll Libreria di importazione DLL per la libreria UCRT.DLL import library for the UCRT. /MD/MD _MT, _DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll Libreria di importazione DLL per la versione di debug della libreria UCRT.DLL import library for the Debug version of the UCRT. Non ridistribuibile.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

La libreria vcruntime contiene codice specifico dell'implementazione della libreria CRT di Visual C++, come il supporto di gestione e debug delle eccezioni, i controlli runtime e le informazioni sui tipi, i dettagli di implementazione e alcune funzioni estese della libreria.The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. Questa libreria è specifica per la versione usata dal compilatore.This library is specific to the version of the compiler used.

Questa tabella elenca le librerie che implementano la libreria vcruntime.This table lists the libraries that implement the vcruntime library.

LibreriaLibrary DLL associataAssociated DLL CaratteristicheCharacteristics OpzioneOption Direttive per il preprocessorePreprocessor directives
libvcruntime.liblibvcruntime.lib nessunoNone Collegata in modo statico al codice.Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib nessunoNone Versione di debug per il collegamento statico.Debug version for static linking. Non ridistribuibile.Not redistributable. /MTd/MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<version>.dllvcruntime<version>.dll Libreria di importazione DLL per la libreria vcruntime.DLL import library for the vcruntime. /MD/MD _MT, _DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<version>d.dllvcruntime<version>d.dll Libreria di importazione DLL per la libreria vcruntime di debug.DLL import library for the Debug vcruntime. Non ridistribuibile.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

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.The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. Questo codice gestisce l'avvio della libreria CRT, l'inizializzazione e la chiusura dei dati per thread.This code handles CRT startup, internal per-thread data initialization, and termination. È specifica per la versione usata dal compilatore.It is specific to the version of the compiler used. Questa libreria è sempre collegata in modo statico, anche quando si usa una libreria UCRT collegata in modo dinamico.This library is always statically linked, even when using a dynamically linked UCRT.

Questa tabella elenca le librerie che implementano l'inizializzazione e la chiusura della libreria CRT.This table lists the libraries that implement CRT initialization and termination.

LibreriaLibrary CaratteristicheCharacteristics OpzioneOption Direttive per il preprocessorePreprocessor directives
LIBCMT.liblibcmt.lib Collega in modo statico l'avvio della libreria UCRT nativa nel codice.Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib Collega in modo statico la versione di Debug dell'avvio della libreria CRT nativa.Statically links the Debug version of the native CRT startup. Non ridistribuibile.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.libmsvcrt.lib Libreria statica per l'avvio della libreria CRT nativa per l'uso con DLL UCRT e vcruntime.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT, _DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib Libreria statica per la versione di debug per l'avvio della libreria CRT nativa da usare con DLL UCRT e vcruntime.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. Non ridistribuibile.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib Libreria statica per l'avvio della libreria CRT nativa e gestita mista per l'uso con DLL UCRT e vcruntime.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.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.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. Non ridistribuibile.Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib Deprecata Libreria statica per la libreria CRT gestita pure.Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib Deprecata Libreria statica per la versione di debug della libreria CRT gestita pure.Deprecated Static library for the Debug version of the pure managed CRT. Non ridistribuibile.Not redistributable. /clr:pure/clr:pure

Se si collega il programma dalla riga di comando senza un'opzione del compilatore che specifichi una libreria di runtime C, il linker userà le librerie CRT collegate in modo statico: libcmt.lib, libvcruntime.lib e libucrt.lib.If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and 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.Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. Ad esempio, se si usano strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l con una libreria CRT collegata staticamente, la posizione del parser strtok non è correlata allo stato strtok usato nel codice dello stesso processo (ma in un file DLL o EXE diverso) collegato a un'altra istanza della libreria CRT statica.For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. 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.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. Questa osservazione non si applica se si usano le nuove versioni più sicure di queste funzioni, ad esempio strtok_s non è interessato da questo problema.This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

Poiché una DLL compilata con un collegamento a una libreria CRT statica avrà un proprio stato CRT, non si consiglia di effettuare un collegamento statico alla libreria CRT in una DLL a meno che gli effetti di questa azione non siano quelli desiderati e non siano compresi appieno.Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. Ad esempio, se si chiama _set_se_translator in un file eseguibile che carica la DLL collegata alla relativa libreria CRT statica, le eccezioni hardware generate dal codice nella DLL non saranno rilevate dal convertitore, mentre saranno rilevate le eccezioni hardware generate dal codice nel file eseguibile principale.For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

Se si usa l'opzione del compilatore /clr , il codice sarà collegato a una libreria statica, msvcmrt.lib.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. La libreria statica fornisce un proxy tra il codice gestito e la libreria CRT nativa.The static library provides a proxy between your managed code and the native CRT. Non è possibile usare la libreria collegata staticamente CRT (opzioni /MT o /MTd ) con /clr.You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. Usare invece le librerie collegate in modo dinamico (/MD o /MDd).Use the dynamically-linked libraries (/MD or /MDd) instead. Le librerie CRT gestite in modalità pure sono deprecate in Visual Studio 2015 e non supportate in Visual Studio 2017.The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Per altre informazioni sull'uso di CRT con /clr, vedere Assembly misti (nativi e gestiti).For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

Per compilare una versione di debug dell'applicazione, è necessario definire il flag _DEBUG e collegare l'applicazione a una versione di debug di una di queste librerie.To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. Per altre informazioni sull'uso delle versioni di debug dei file della libreria, vedere Tecniche di debug CRT.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

Questa versione della libreria CRT non è completamente conforme allo standard C99.This version of the CRT is not fully conformant with the C99 standard. In particolare, l'intestazione <tgmath.h> e le macro pragma CX_LIMITED_RANGE/FP_CONTRACT non sono supportate.In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. Alcuni elementi, ad esempio il significato degli identificatori di parametro nelle funzioni I/O standard usano interpretazioni legacy per impostazione predefinita.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. È possibile usare le opzioni di conformità del compilatore /Zc e specificare le opzioni del linker per controllare alcuni aspetti di conformità della libreria.You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

Libreria standard C++C++ Standard Library

Libreria standard C++C++ Standard Library CaratteristicheCharacteristics OpzioneOption Direttive per il preprocessorePreprocessor directives
libcpmt.liblibcpmt.lib Multithreading, collegamento staticoMultithreaded, static link /MT/MT _MT_MT
msvcprt.libmsvcprt.lib Multithreading, collegamento dinamico (libreria di importazione per MSVCPversion.dll)Multithreaded, dynamic link (import library for MSVCPversion.dll) /MD/MD _MT, _DLL_MT, _DLL
libcpmtd.liblibcpmtd.lib Multithreading, collegamento staticoMultithreaded, static link /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.libmsvcprtd.lib Multithreading, collegamento dinamico (libreria di importazione per MSVCPversionD.DLL)Multithreaded, dynamic link (import library for MSVCPversionD.DLL) /MDd/MDd _DEBUG, _MT, _DLL_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) viene collegata per impostazione predefinita, a seconda dell'opzione del compilatore scelta (multithreading, DLL, /clr).When you build a release version of your project, one of the basic C run-time libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). Se si include uno dei file di intestazione della libreria standard di C++ nel codice, Visual C++ collegherà automaticamente una libreria C++ standard in fase di compilazione.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. Ad esempio:For example:

#include <ios>

Per la compatibilità binaria, più file DLL possono essere specificati da una singola libreria di importazione.For binary compatibility, more than one DLL file may be specified by a single import library. Gli aggiornamenti della versione possono introdurre file dot.dll, DLL separate che presentano nuove funzionalità della libreria.Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. Ad esempio, con la versione 15.6 di Visual Studio 2017 è stata introdotta la libreria msvcp140_1.dll per supportare funzionalità aggiuntive della libreria standard senza interrompere l'ABI supportato da msvcp140.dll.For example, Visual Studio 2017 version 15.6 introduced msvcp140_1.dll to support additional standard library functionality without breaking the ABI supported by msvcp140.dll. La libreria di importazione msvcprt.lib inclusa nel set di strumenti per Visual Studio 2017 versione 15.6 supporta entrambe le DLL e il vcredist per questa versione installa entrambe le DLL.The msvcprt.lib import library included in the toolset for Visual Studio 2017 version 15.6 supports both DLLs, and the vcredist for this version installs both DLLs. Dopo essere stata specificata, una libreria dot.dll ha un ABI fisso e non avrà mai una dipendenza su una libreria dot.dll successiva.Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

Quali problemi si verificano se un'applicazione usa più di una versione CRT?What problems exist if an application uses more than one CRT version?

Ogni immagine di eseguibile (EXE o DLL) può avere un CRT proprio collegato staticamente o è possibile impostare un collegamento dinamico a un CRT.Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a 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.The version of the CRT statically included in or dynamically loaded by a particular image depends on the version of the tools and libraries it was built with. Un singolo processo può caricare più immagini di EXE e DLL, ognuna con un CRT proprio.A single process may load multiple EXE and DLL images, each with its own CRT. Ognuno di tali CRT potrebbe usare un allocatore diverso, avere layout di struttura interna diversi oppure usare disposizioni di archiviazione differenti.Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. Ciò significa che la memoria allocata, le risorse CRT o le classi passate oltre i limiti di una DLL possono causare problemi a livello di gestione della memoria, utilizzo statico interno o interpretazione deli layout.This means that allocated memory, CRT resources, or classes passed across a DLL boundary can cause problems in memory management, internal static usage, or layout interpretation. Ad esempio, se una classe è allocata in una DLL ma viene passata ed eliminata da un'altra, quale deallocatore CRT viene usato?For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? Gli errori causati possono essere di minore entità fino a immediatamente irreversibili e il trasferimento diretto di tali risorse è quindi fortemente sconsigliato.The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

È possibile evitare molti di questi problemi usando tecnologie ABI (Application Binary Interface) in alternativa, perché sono progettate per essere stabili e supportare le versioni.You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. 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.Design your DLL export interfaces to pass information by value, or to work on memory that is passed in by the caller rather than allocated locally and returned to the caller. Usare le tecniche di marshalling per copiare dati strutturati tra le immagini eseguibili.Use marshalling techniques to copy structured data between executable images. Incapsulare le risorse in locale e consentire la modifica solo tramite handle o funzioni esposti ai client.Encapsulate resources locally and only allow manipulation through handles or functions you expose to clients.

È anche possibile evitare alcuni di questi problemi se tutte le immagini nel processo usano la stessa versione caricata in modo dinamico del CRT.It's also possible to avoid some of these issues if all of the images in your process use the same dynamically loaded version of the CRT. Per assicurarsi che tutti i componenti usino la stessa versione DLL del CRT, crearli con l'opzione /MD e usare lo stesso set di strumenti del compilatore e le stesse impostazioni delle proprietà.To ensure that all components use the same DLL version of the CRT, build them by using the /MD option, and use the same compiler toolset and property settings.

È necessario prestare attenzione se il programma passa determinate risorse CRT (ad esempio, handle di file, impostazioni locali e variabili di ambiente) tra i limiti DLL, anche quando si usa la stessa versione del CRT.Some care is needed if your program passes certain CRT resources (such as file handles, locales and environment variables) across DLL boundaries, even when using the same version of the CRT. Per altre informazioni su questi problemi e su come risolverli, vedere Potenziali errori di passaggio di oggetti CRT attraverso i limiti DLL.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

Vedere ancheSee also