Condividi tramite


Funzionalità libreria CRT

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.

Librerie di runtime C (CRT)

Le seguenti librerie contengono le funzioni delle librerie di runtime C.

Libreria di runtime C (senza iostream o libreria standard di C++)

DLL associata

Caratteristiche

Opzione

Direttive per il preprocessore

libcmt.lib

Nessuna, collegamento statico.

Multithreading, collegamento statico

/MT

_MT

msvcrt.lib

msvcr120.dll

Multithreading, collegamento dinamico (libreria di importazione per MSVCR120.DLL). Se si usa la libreria standard di C++, è necessario MSVCP120.DLL per eseguire il programma.

/MD

_MT, _DLL

libcmtd.lib

Nessuna, collegamento statico

Multithreading, collegamento statico (debug)

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr120d.dll

Multithreading, collegamento dinamico (libreria di importazione per MSVCR120D.DLL) (debug).

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

Nessuna, collegamento statico

Libreria statica di runtime C. Usata per il codice misto gestito/nativo.

/clr

 

msvcurt.lib

Nessuna, collegamento statico

Libreria statica di runtime C compilata con codice MSIL puro al 100%. Tutti i codici sono conformi alla specifica ECMA URT per MSIL.

/clr:pure

 

Nota

La libreria CRT a thread singolo (libc.lib, libcd.lib) (in precedenza, le opzioni /ML o /MLd) non è più disponibile.Usare invece la libreria CRT con multithreading.Vedere Prestazioni librerie multithread.

Se si collega il programma dalla riga di comando senza un'opzione del compilatore che specifichi una libreria di runtime C, il linker userà LIBCMT.LIB. Questo comportamento è diverso rispetto alle versioni precedenti di Visual C++ che usavano LIBC.LIB, la libreria a thread singolo.

L'uso di una libreria CRT collegata staticamente implica che tutte le informazioni di stato salvate dalla libreria di runtime C saranno locali in questa istanza di CRT. Ad esempio, se si usa 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. Al contrario, la libreria CRT collegata dinamicamente condivide lo stato per tutto il codice all'interno di un processo collegato dinamicamente alla libreria 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.

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. 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.

Se si usa l'opzione del compilatore /clr, il codice sarà 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 la libreria collegata staticamente CRT (opzioni /MT o /MTd) con /clr. Usare invece le librerie collegate dinamicamente (/MD o /MDd).

Se si usa l'opzione del compilatore /clr:pure, il codice sarà collegato alla libreria statica msvcurt.lib. Analogamente a /clr, non è possibile effettuare il collegamento alla libreria collegata staticamente.

Per altre informazioni sull'uso della libreria CRT con /clr, vedere Assembly misti (nativi e gestiti). Per /clr:pure, vedere Codice pure e verificabile (C++/CLI).

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. Per altre informazioni sull'uso delle versioni di debug dei file della libreria, vedere Tecniche di debug CRT.

Questa versione di Visual C++ non è conforme allo standard C99.

Libreria standard di C++

Libreria standard di C++

Caratteristiche

Opzione

Direttive per il preprocessore

LIBCPMT.LIB

Multithreading, collegamento statico

/MT

_MT

MSVCPRT.LIB

Multithreading, collegamento dinamico (libreria di importazione per MSVCP120.dll)

/MD

_MT, _DLL

LIBCPMTD.LIB

Multithreading, collegamento statico

/MTd

_DEBUG, _MT

MSVCPRTD.LIB

Multithreading, collegamento dinamico (libreria di importazione per MSVCP120D.DLL)

/MDd

_DEBUG, _MT, _DLL

Nota   LIBCP.LIB e LIBCPD.LIB (tramite le precedenti opzioni /ML e /MLd) sono stati rimossi. Usare invece LIBCPMT.LIB e LIBCPMTD.LIB tramite le opzioni /MT e /MTd.

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). Se si include uno dei File di intestazione libreria standard C++ nel codice, una libreria standard di C++ sarà collegata automaticamente da Visual C++ in fase di compilazione. Ad esempio:

#include <ios> 

Per modificare la libreria di runtime C di base collegata in Visual Studio, aprire le pagine delle proprietà del progetto. Aprire la pagina Proprietà di configurazione, C/C++, Generazione codice e modificare l'impostazione Libreria di runtime. Per modificare la libreria Common Language Runtime, aprire le pagine delle proprietà del progetto. Aprire la pagina Proprietà di configurazione, C/C++, Generale e modificare l'impostazione Supporto Common Language Runtime.

Qual è la differenza tra msvcrt.dll e msvcr120.dll?

Ora, msvcrt.dll è una "DLL nota", ossia è un componente di sistema che appartiene ed è compilato da Windows. È pensato per un utilizzo futuro solo da parte dei componenti a livello di sistema.

Quali problemi si verificano se un'applicazione usa sia msvcrt.dll che msvcr120.dll?

Se si ha un file lib o obj che deve essere collegato a msvcrt.lib, non è necessario ricompilarlo per usare il nuovo file msvcrt.lib in Visual C++. Il file lib o obj può basarsi su dimensioni, offset di campi o nomi di funzioni membro di varie classi o variabili CRT e tutti questi elementi devono essere compatibili. Quando si esegue il collegamento con msvcrt.lib, le immagini EXE e DLL finali avranno una dipendenza da msvcr120.dll invece che da msvcrt.dll.

Se sono presenti più file DLL o EXE, verranno create più librerie CRT, indipendentemente dal fatto che si usino versioni diverse di Visual C++. Ad esempio, il collegamento statico della libreria CRT a più DLL può produrre lo stesso problema. Agli sviluppatori che rilevano questo problema con le librerie CRT statiche sono state fornite istruzioni per eseguire la compilazione con /MD per usare la DLL di CRT. Ora che la DLL di CRT è stata rinominata msvcr120.dll, le applicazioni possono avere alcuni componenti collegati a msvcrt.dll e altri a msvcr120.dll. Se le DLL passano le risorse CRT tra i limiti di msvcrt.dll e msvcr120.dll, si verificherà lo stesso problema con le librerie CRT senza corrispondenza e sarà necessario ricompilare il progetto Visual C++.

Se il programma usa più versioni della libreria CRT, è necessario prestare attenzione quando si passano determinati oggetti CRT (ad esempio, handle di file, impostazioni locali e variabili di ambiente) tra i limiti DLL. Per altre informazioni su questi problemi e su come risolverli, vedere Potenziali errori di passaggio di oggetti CRT attraverso i limiti DLL.

Vedere anche

Altre risorse

Riferimenti alla libreria di runtime C