Funzionalità della libreria CRT
In questo argomento vengono illustrati i diversi file LIB che comprendono 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 della libreria di runtime C.
Libreria di runtime c (senza iostream o libreria standard di C++) |
DLL associata |
Caratteristica |
Opzione |
Direttive del preprocessore |
---|---|---|---|---|
LIBCMT. lib |
Nessuno, collegamento statico. |
Collegamento con multithreading, statico |
_MT |
|
Msvcrt. lib |
msvcr110.dll |
Collegamento dinamico con multithreading (libreria di importazione per MSVCR110.DLL).Tenere presente che se si utilizza la libreria Standard di C++, il programma necessario MSVCP110.DLL per l'esecuzione. |
MT, DLL |
|
libcmtd. lib |
Nessun collegamento statico |
Collegamento statico con multithreading (debug) |
/MTd |
DEBUG, MT |
MSVCRTD. lib |
msvcr110d.dll |
Collegamento dinamico con multithreading (libreria di importazione per MSVCR110D.DLL) (debug). |
/MDd |
DEBUG, MT, DLL |
msvcmrt. lib alla |
Nessun collegamento statico |
Libreria statica di Runtime C.Utilizzato per il codice gestito/nativo misto. |
/clr /clr:oldSyntax |
|
Msvcurt.lib |
Nessun collegamento statico |
Libreria di Runtime C statica compilato come codice MSIL puro 100%.Tutto il codice è conforme alla specifica ECMA URT per MSIL. |
/clr:pure |
|
[!NOTA]
CRT a thread singolo (LIBC. lib, LIBCD. lib) (in precedenza il /ML o /MLd opzioni) non è più disponibile.Utilizzare invece la CRT con multithreading.Vedere Prestazioni multithreading di libreria.
Se si collega il programma dalla riga di comando senza un'opzione del compilatore che specifica una libreria di runtime C, il linker utilizzi LIBCMT.LIB.Questo è diverso rispetto alle versioni precedenti di Visual C++ che utilizzato LIBC.LIB, libreria a thread singolo invece.
Utilizzo di CRT collegate staticamente implica che tutte le informazioni di state salvate dalla libreria di runtime c sarà locale a tale istanza di CRT.Ad esempio, se si utilizza strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l quando si utilizza un CRT collegata in modo statico, la posizione del strtok parser non siano collegate ai strtok stato utilizzato nel codice nello stesso processo (ma in un altro file DLL o EXE) è collegato a un'altra istanza di CRT statiche.Al contrario, CRT collegata dinamicamente condivide lo stato per tutto il codice all'interno di un processo che viene collegato in modo dinamico a CRT.Questo problema non si applica se si utilizzano le nuove versioni più sicure di queste funzioni; ad esempio, strtok_s non presentano questo problema.
Poiché il proprio stato CRT dispone di una DLL creata tramite il collegamento a CRT statica, non è consigliabile per il collegamento statico a CRT in una DLL a meno che le conseguenze di questo sono specificamente desiderate e comprensibile.Ad esempio, se si chiama set_se_translator in un file eseguibile che carica la DLL collegata a un proprio CRT statiche, tutte le eccezioni hardware generate dal codice nella DLL non verranno intercettate dal traduttore, ma verranno rilevate eccezioni hardware generate dal codice del file eseguibile principale.
Se si utilizza il /clr opzione del compilatore, il codice verrà collegato con una libreria statica, msvcmrt. lib alla.La libreria statica offre un proxy tra codice gestito e nativa CRT.Non è possibile utilizzare CRT collegata in modo statico ( /MT o /MTd opzioni) con /clr.Utilizzare le librerie collegate in modo dinamico (/MD o /MDd) al contrario.
Se si utilizza il /clr:pure opzione del compilatore, il codice verrà collegato con il msvcurt.lib di libreria statica.Come con /clr, non è possibile collegare la libreria collegata staticamente.
Per ulteriori informazioni sull'uso di CRT con /clr, vedere Assembly misti (nativi e gestiti); for /clr:pure, see Codice pure e verificabile (C++/CLI).
Per creare una versione di debug dell'applicazione, il debug flag deve essere definito e l'applicazione deve essere collegato a una versione di debug di una di queste librerie.Per ulteriori informazioni sull'utilizzo di versioni di debug dei file di libreria, vedere Tecniche di debug CRT.
Questa versione di Visual C++ non è conforme con lo standard C99.
Libreria standard di C++
Libreria standard di C++ |
Caratteristica |
Opzione |
Direttive del preprocessore |
---|---|---|---|
LIBCPMT.LIB |
Collegamento con multithreading, statico |
/MT |
_MT |
MSVCPRT.LIB |
Collegamento dinamico con multithreading (libreria di importazione per MSVCP110.dll) |
/MD |
MT, DLL |
LIBCPMTD.LIB |
Collegamento con multithreading, statico |
/MTd |
DEBUG, MT |
MSVCPRTD.LIB |
Collegamento dinamico con multithreading (libreria di importazione per MSVCP110D.DLL) |
/MDd |
DEBUG, MT, DLL |
Nota LIBCP.LIB e LIBCPD.LIB (tramite il vecchio /ML e /MLd opzioni) sono state rimosse.Utilizzare LIBCPMT.LIB e LIBCPMTD.LIB invece tramite il /MT e /MTd opzioni.
Quando si genera una versione di rilascio del progetto, una base librerie di runtime C (LIBCMT.LIB MSVCMRT.LIB, MSVCRT.LIB) è collegato in base all'impostazione predefinita, in base all'opzione del compilatore è scegliere (multithread, DLL, /clr).Se si includa uno della File di intestazione nel codice, una libreria C++ Standard verranno collegata automaticamente da Visual C++ in fase di compilazione.Di seguito è riportato un esempio:
#include <ios>
Qual è la differenza tra Msvcrt. dll e msvcr110.dll?
Il file Msvcrt. dll è ora una "DLL conosciuta", vale a dire che è un componente del sistema di proprietà e creati da Windows.Ne è previsto l'utilizzo futuro solo da componenti a livello di sistema.
Quali problemi esistono se un'applicazione utilizza Msvcrt. dll e msvcr110.dll?
Se si dispone di un file LIB oppure OBJ necessarie per il collegamento a Msvcrt. lib, quindi non è necessario ricompilare per poterlo utilizzare con il nuovo MSVCRT in Visual C++.Il file LIB oppure OBJ può fare affidamento sulle dimensioni, offset di campo e i nomi delle funzioni membro delle varie classi CRT o delle variabili e quelle dovrebbero tutti ancora presenti in un modo compatibile.Quando Ricollega contro Msvcrt. lib, l'immagine finale per il file EXE e DLL avranno una dipendenza su msvcr110.dll anziché Msvcrt. dll.
Se si dispone di più di una DLL o EXE, quindi potrebbe essere più CRT, indipendentemente dal fatto che si utilizzino versioni diverse di Visual C++.Ad esempio, il collegamento statico al CRT in più DLL può presentare lo stesso problema.Gli sviluppatori che si verifichi questo problema con schermi CRT statiche sono state fornite istruzioni per la compilazione con /MD la DLL CRT.Ora che la DLL CRT è stata rinominata in msvcr110.dll, applicazioni potrebbero avere alcuni componenti collegate a Msvcrt. dll e altri a msvcr110.dll.Se la DLL passa risorse CRT attraverso il confine Msvcrt. dll e msvcr110.dll, si si verifichino problemi con schermi CRT non corrispondenti e necessario ricompilare il progetto con Visual C++.
Se il programma utilizza più di una versione di CRT, particolare attenzione è necessaria quando si passano oggetti specifici CRT (ad esempio handle di file, impostazioni internazionali e le variabili di ambiente) attraverso i confini DLL.Per ulteriori informazioni sui problemi correlati e come risolverli, vedere Errori potenziali che passano oggetti CRT oltre i limiti di DLL.