En Visual Studio, están los indicadores de compilación / MD y / MT que le permiten elegir qué tipo de biblioteca de tiempo de ejecución C desea.
Entiendo la diferencia en la implementación, pero todavía no estoy seguro de cuál usar. ¿Cuáles son los pros / contras?
Una de las ventajas de / MD que he escuchado es que esto permite que alguien actualice el tiempo de ejecución (como parchear un problema de seguridad) y mi aplicación se beneficiará de esta actualización. Aunque para mí, esto casi no parece una característica: ¡no quiero que la gente cambie mi tiempo de ejecución sin permitirme probar con la nueva versión!
Algunas cosas que tengo curiosidad sobre:
- ¿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 usa la mayoría de la gente?
Respuestas:
Al vincular dinámicamente con / MD,
También he descubierto que, en la práctica, cuando se trabaja con bibliotecas de terceros binarias vinculadas estáticamente que se han creado con diferentes opciones de tiempo de ejecución, / MT en la aplicación principal tiende a causar conflictos con mucha más frecuencia que / MD (porque Tendrá problemas si el tiempo de ejecución de C está vinculado estáticamente varias veces, especialmente si son versiones diferentes).
fuente
/MT
será un poco más rápido en tiempo de ejecución ya que su aplicación no necesita buscar la implementación de la función de tiempo de ejecución cada vez, no soy un experto en este nivel, pero estoy bastante seguro de que la mayoría de Los sistemas operativos almacenarán en caché las implementaciones de tiempo de ejecución para que su aplicación use la versión en caché, por lo que la diferencia no estará tan lejos, TENGA EN CUENTA que mencioné que no estoy seguro, así que no tome este comentario como argumento.Si está utilizando DLL, entonces debe optar por el CRT vinculado dinámicamente (/ MD).
Si utiliza el CRT dinámico para su .exe y todos los .dlls, todos compartirán una única implementación del CRT, lo que significa que todos compartirán un único montón de CRT y la memoria asignada en un .exe / .dll puede liberarse otro.
Si usa el CRT estático para su .exe y todos los .dlls, todos obtendrán una copia separada del CRT, lo que significa que todos usarán su propio montón de CRT, por lo que la memoria debe liberarse en el mismo módulo en el que se encuentra. fue asignado. También sufrirá una acumulación de código (varias copias de la CRT) y una sobrecarga de tiempo de ejecución excesiva (cada montón asigna memoria del sistema operativo para realizar un seguimiento de su estado, y la sobrecarga puede ser notable).
fuente
Creo que el valor predeterminado para proyectos creados a través de Visual Studio es / MD.
Si usa / MT, su ejecutable no dependerá de una DLL presente en el sistema de destino. Si está envolviendo esto en un instalador, probablemente no será un problema y puede ir en cualquier dirección.
Yo mismo uso / MT, para poder ignorar todo el desastre de DLL.
PD: Como señala el Sr. Fooz , es vital ser coherente. Si está vinculando con otras bibliotecas, debe usar la misma opción que ellas. Si está utilizando una DLL de terceros, es casi seguro que necesitará usar la versión DLL de la biblioteca en tiempo de ejecución.
fuente
Prefiero vincular estáticamente con / MT.
Aunque obtenga un ejecutable más pequeño con / MD, aún tiene que enviar un montón de archivos DLL para asegurarse de que el usuario obtenga la versión correcta para ejecutar su programa. Y al final su instalador será MÁS GRANDE que cuando se vincule con / MT.
Lo que es aún peor, si elige colocar sus bibliotecas de tiempo de ejecución en el directorio de Windows, tarde o temprano el usuario instalará una nueva aplicación con diferentes bibliotecas y, con cualquier mala suerte, romperá su aplicación.
fuente
El problema con el que se encontrará con / MD es que la versión de destino del CRT puede no estar en la máquina de sus usuarios (especialmente si está utilizando la última versión de Visual Studio y el usuario tiene un sistema operativo más antiguo).
En ese caso, tiene que descubrir cómo obtener la versión correcta en su máquina.
fuente
de http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Entonces, si lo estoy interpretando correctamente, entonces / MT enlaza estáticamente y / MD enlaza dinámicamente.
fuente
Si está compilando archivos ejecutables que usan otras dlls o libs que la opción / MD es preferible porque de esa manera todos los componentes compartirán la misma biblioteca. Por supuesto, esta opción debe coincidir con todos los módulos involucrados, es decir, dll / lib / exe.
Si su ejecutable no usa ninguna lib o dll, entonces es la llamada de cualquiera. La diferencia no es demasiado ahora porque el aspecto de compartir no está en juego.
Entonces, tal vez pueda iniciar la aplicación con / MT, ya que no hay una razón convincente de lo contrario, pero cuando llegue el momento de agregar una lib o dll, puede cambiarla a / MD con la de lib / dll, que es fácil.
fuente