Domanda

In Visual Studio, ci sono i flag di compilazione / MD e / MT, che consentono di scegliere quale tipo di libreria di runtime C che si desidera.

ho capito la differenza di realizzazione, ma non sono ancora sicuro quale usare. Quali sono i vantaggi / svantaggi?

Un vantaggio a / MD che ho sentito, è che questo permette a qualcuno di aggiornare il runtime, (come forse patch di un problema di sicurezza) e la mia app potranno beneficiare di questo aggiornamento. Anche se a me, questo sembra quasi un non-funzione:! Io non voglio che la gente cambiare la mia runtime senza che mi permette di testare contro la nuova versione

Alcune cose mi incuriosisce:

  • Come questo influenzerà il tempo di compilazione? (Presumibilmente / MT è un po 'più lento?)
  • Quali sono le altre implicazioni?
  • Uno che la maggior parte delle persone usano?
È stato utile?

Soluzione

Con il collegamento in modo dinamico con / MD,

  • si sono esposti agli aggiornamenti di sistema (per il bene o per il male),
  • l'eseguibile può essere più piccolo (dal momento che non ha la libreria incorporato in esso), e
  • Credo che al minimo il segmento di codice di una DLL viene condivisa tra tutti i processi che sono attivamente usando (riducendo la quantità totale di RAM consumata).

Ho anche scoperto che, in pratica, quando si lavora con staticamente-linked 3rd-party librerie solo binario che sono state costruite con diverse opzioni di runtime, / MT nel ricorso principale tende a causare conflitti molto più spesso di quanto / MD (perché si incorrerà in problemi se il runtime C è collegata in modo statico più volte, soprattutto se sono diverse versioni).

Altri suggerimenti

Se si utilizza DLL allora si dovrebbe andare per il CRT collegata in modo dinamico (/ MD).

Se si utilizza il CRT dinamico per il file exe e dll tutti poi saranno tutti condividere una singola implementazione del CRT - il che significa che saranno tutti condividono un singolo heap CRT e la memoria allocata in un unico exe / dll possono essere liberato in un altro.

Se si utilizza il CRT statico per il file exe e dll tutti poi saranno tutti ottenere una copia separata del CRT - il che significa che saranno tutti utilizzano il proprio mucchio CRT in modo memoria deve essere liberata nello stesso modulo in cui è stato allocato. Avrete anche soffre di gonfiare il codice (più copie del CRT) e spese generali di esecuzione in eccesso (ogni heap alloca la memoria dal sistema operativo per tenere traccia del suo stato, e il sovraccarico può essere evidente).

Credo che il default per progetti realizzati tramite Visual Studio è / MD.

Se si utilizza / MT, l'eseguibile non sarà dipenderà da una DLL essere presente sul sistema di destinazione. Se stai avvolgendo questo in un programma di installazione, probabilmente non sarà un problema e si può andare in entrambi i modi.

Io uso / MT me stesso, in modo che posso ignorare tutta la DLL pasticcio.

P.S. Come Mr. Fooz sottolinea, è fondamentale essere coerenti. Se stai collegamento con altre biblioteche, è necessario utilizzare la stessa opzione che fanno. Se stai usando una terza DLL di festa, è quasi certo che sarà necessario utilizzare la versione DLL della libreria di runtime.

Io preferisco collegare staticamente con / MT.

Anche se si ottiene un file eseguibile più piccolo con / MD, si devono ancora spedire un mazzo di DLL per assicurarsi che l'utente ottiene la versione giusta per l'esecuzione del programma. E alla fine il vostro installatore sta per essere più grande rispetto a quando il collegamento con / MT.

Ciò che è peggio, se si sceglie di mettere le librerie di runtime nella directory di Windows, prima o poi l'utente sta per installare una nuova applicazione con diverse librerie e, con qualsiasi sfortuna, rompere la vostra applicazione.

Il problema si andrà in contro con / MD è che la versione di destinazione del CRT non può essere sul computer degli utenti (soprattutto se si sta utilizzando l'ultima versione di Visual Studio e l'utente ha un sistema operativo precedente).

In questo caso si deve capire come ottenere la versione a destra sulla loro macchina.

http://msdn.microsoft.com/ it-it / library / 2kzt1wy3 (VS.71) aspx :

  

/ MT Definisce _MT in modo che le versioni specifiche multithread delle routine di runtime sono selezionati tra l'intestazione standard dei file (.h). Questa opzione fa sì che anche il compilatore di inserire il nome LIBCMT.LIB libreria nel file obj in modo che il linker utilizzi LIBCMT.LIB per risolvere i simboli esterni. O / MT o / MD (o loro equivalenti di debug / MTd o / MDD) è necessario per creare programmi multithread.

     

/ MD Definisce _MT e _DLL in modo che entrambe le versioni multithread- e specifici DLL delle routine di runtime sono selezionati tra i file .h standard. Questa opzione fa sì che anche il compilatore di inserire il nome della libreria MSVCRT.lib nel file obj.

     

Le applicazioni compilate con questa opzione sono staticamente collegati a MSVCRT.lib. Questa libreria fornisce un livello di codice che consente al linker di risolvere i riferimenti esterni. Il codice effettivo di lavoro è contenuto in MSVCR71.DLL, che deve essere disponibile in fase di esecuzione di applicazioni collegate con MSVCRT.lib.

     

Quando / MD viene utilizzato con _STATIC_CPPLIB definito (/ D_STATIC_CPPLIB) causerà l'applicazione di collegamento con la libreria statica ++ multithread standard C (LIBCPMT.LIB) al posto della versione dinamica (MSVCPRT.lib), pur in modo dinamico il collegamento al CRT principale tramite msvcrt.lib.

Quindi, se sto interpretando correttamente allora / MT link statico e / MD link dinamico.

Se si sta costruendo eseguibile che utilizza altre DLL o librerie di opzione / MD è preferito perché in questo modo tutti i componenti sarà la condivisione stessa libreria. Naturalmente questa opzione dovrebbe corrispondere per tutti i moduli coinvolti cioè dll / lib / exe.

Se il file eseguibile non utilizza alcun lib o dll di chiamata del suo nessuno. La differenza non è troppo ora, perché l'aspetto di condivisione non è in gioco.

Così forse si può iniziare l'applicazione con / MT in quanto non v'è alcun motivo valido altrimenti ma quando è il momento di aggiungere un lib o DLL, è possibile modificarlo in / MD con quella del lib / dll che è facile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top