Pregunta

En Visual Studio, hay las banderas de compilación / MD y / MT, que le permiten elegir qué tipo de biblioteca de C funcionamiento que se desea.

entiendo la diferencia en la aplicación, pero todavía no estoy seguro de cuál usar. ¿Cuáles son los pros / contras?

Una de las ventajas a / MD que he escuchado, es que esto permite a alguien para actualizar el tiempo de ejecución, (como podría ser un problema de seguridad parche) y mi aplicación se beneficiará de esta actualización. Aunque a mí, esto casi parece como un no-función: Yo no quiero que la gente cambiar de tiempo de ejecución sin que me permite poner a prueba en contra de la nueva versión

Algunas cosas tengo curiosidad por:

  • ¿Cómo afectaría esto a los tiempos de construcción? (Presumiblemente / MT es un poco más lento?)
  • ¿Cuáles son las otras implicaciones?
  • ¿Cuál de ellos utilizan la mayoría de la gente?
¿Fue útil?

Solución

Al vincular dinámicamente con / MD,

  • usted está expuesto a las actualizaciones del sistema (para bien o para mal),
  • su ejecutable puede ser más pequeña (ya que no tiene la biblioteca incrustado en él), y
  • Creo que en muy menos el segmento de código de un DLL se comparte entre todos los procesos que utilizan activamente (reducción de la cantidad total de RAM consumida).

También he encontrado que en la práctica, cuando se trabaja con bibliotecas binarias de sólo 3 ª parte vinculados estáticamente que se han construido con diferentes opciones de tiempo de ejecución, / TM en la aplicación principal tiende a provocar conflictos mucho más a menudo que / MD (porque se encontrará con problemas si el tiempo de ejecución C está ligada de forma estática varias veces, sobre todo si son diferentes versiones).

Otros consejos

Si está utilizando DLL entonces hay que ir por el CRT de enlace dinámico (/ MD).

Si utiliza la dinámica CRT para su .exe y .dll todos entonces todos compartirán una única aplicación de la CRT - lo que significa que todos comparten un único montón CRT y la memoria asignada en un .exe / .dll pueden ser liberado en otro.

Si utiliza el CRT estática para su .exe y .dll todos entonces todos ellos se consigue una copia separada de la CRT - lo que significa que todos los que vamos a usar su propio montón CRT lo que la memoria debe ser liberado en el mismo módulo en la que se le asignó. Usted también sufre de hinchazón de código (múltiples copias de la CRT) y el exceso de sobrecarga de tiempo de ejecución (cada montón asigna memoria del sistema operativo para realizar un seguimiento de su estado, y la sobrecarga puede ser notable).

Creo que el defecto para proyectos construidos a través de Visual Studio es / MD.

Si utiliza / MT, el ejecutable no dependerá de una DLL que está presente en el sistema de destino. Si va a envolver esto en un instalador, probablemente no será un problema y se puede ir en cualquier dirección.

Yo uso / MT a mí mismo, para que pueda pasar por alto todo el lío de DLL.

P.S. Como Sr. Fooz señala, es vital ser consistente. Si va a enlazar con otras bibliotecas, es necesario utilizar la misma opción que hacen. Si está utilizando una tercera parte de DLL, es casi seguro que tendrá que utilizar la versión DLL de la biblioteca de tiempo de ejecución.

Yo prefiero enlazar estáticamente con / MT.

A pesar de que usted consigue un ejecutable más pequeño con / MD, todavía tiene que enviar un montón de DLL para asegurarse de que el usuario obtiene la versión correcta para el funcionamiento de su programa. Y al final el instalador va a ser más grande que cuando se enlaza con / MT.

Lo que es aún peor, si decide poner sus bibliotecas de ejecución en el directorio de Windows, tarde o temprano, el usuario va a instalar una nueva aplicación con diferentes bibliotecas y, con cualquier mala suerte, rompa su aplicación.

El problema que se ejecutará en con / MD es que la versión de destino de la CRT puede no estar en su máquina de los usuarios (especialmente si usted está utilizando la última versión de Visual Studio y el usuario tiene un sistema operativo anterior).

En ese caso, usted tiene que encontrar la manera de obtener la versión de la derecha en su máquina.

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

  

/ MT Define _MT por lo que las versiones multiproceso-específica de las rutinas de tiempo de ejecución se seleccionan del encabezado estándar (.h) archivos. Esta opción también hace que el compilador para colocar el nombre LIBCMT.LIB biblioteca en el archivo .obj para que el enlazador utilizará LIBCMT.LIB a resolver los símbolos externos. De cualquier / MT o / MD (o sus equivalentes de depuración / o MTd / MDD) se requiere para crear programas multihilo.

     

/ MD Define _MT y _DLL de modo que ambas versiones multithread- y DLL específica de las rutinas de tiempo de ejecución se seleccionan a partir de los archivos .h estándar. Esta opción también hace que el compilador para colocar el nombre de la biblioteca MSVCRT.LIB en el archivo .obj.

     

Las aplicaciones compiladas con esta opción se estáticamente vinculados a MSVCRT.LIB. Esta biblioteca proporciona una capa de código que permite que el enlazador para resolver referencias externas. El código de trabajo real está contenida en librería MSVCR71.DLL, que debe estar disponible en tiempo de ejecución de aplicaciones vinculadas con MSVCRT.LIB.

     

Cuando / MD se utiliza con _STATIC_CPPLIB definido (/ D_STATIC_CPPLIB) que hará que la aplicación para enlazar con la Biblioteca ++ estática multihilo Standard C (libcpmt.lib) en lugar de la versión dinámica (MSVCPRT.lib) mientras que todavía dinámicamente ligarse a la CRT principal a través de msvcrt.lib.

Así que si estoy interpretando correctamente a continuación, / MT enlaces estática y / MD enlaces de forma dinámica.

Si usted está construyendo ejecutable que utiliza otros archivos DLL o bibliotecas que se prefiere la opción / MD porque de esa manera todos los componentes estarán compartiendo misma biblioteca. Por supuesto, esta opción debe coincidir para todos los módulos implicados es decir DLL / lib / exe.

Si el ejecutable no utiliza ningún lib o DLL que la llamada de su cualquiera. La diferencia no es demasiado ahora porque el aspecto compartir no es en juego.

Así que tal vez se puede iniciar la aplicación con / MT ya que no hay ninguna razón de peso de otro modo, pero cuando es el momento de añadir un lib o DLL, puede cambiarlo a / MD con el de la lib / dll, el cual es fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top