world tag near and c++ visual-studio msbuild msvcrt crt

c++ - world - tag and title near me



¿Debo compilar con/MD o/MT? (7)

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ño (ya que no tiene la biblioteca incrustada), y
  • Creo que, al menos, el segmento de código de una DLL se comparte entre todos los procesos que lo están usando activamente (reduciendo la cantidad total de RAM consumida).

También descubrí que, en la práctica, cuando se trabaja con bibliotecas binarias de terceros 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 mucho más a menudo que / MD (porque Se encontrará con problemas si el tiempo de ejecución de C está vinculado estáticamente múltiples veces, especialmente si son versiones diferentes).

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 de C desea.

Entiendo la diferencia en la implementación, pero aún 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 por ejemplo, corregir un problema de seguridad) y mi aplicación se beneficiará con esta actualización. Aunque para mí, esto casi parece una falta de características: ¡no quiero que la gente cambie mi tiempo de ejecución sin permitirme probar contra la nueva versión!

Algunas cosas que me interesan:

  • ¿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?

Creo que el valor predeterminado para los proyectos creados a través de Visual Studio es / MD.

Si usa / MT, su ejecutable no dependerá de que una DLL esté presente en el sistema de destino. Si está envolviendo esto en un instalador, probablemente no sea un problema y puede ir de cualquier manera.

Yo uso / MT yo mismo, por lo que puedo ignorar todo el lío DLL.

PD Como el Sr. Fooz señala, es vital ser consecuente. Si está enlazando con otras bibliotecas, debe usar la misma opción que ellos. Si está utilizando una DLL de un tercero, es casi seguro que necesitará usar la versión DLL de la biblioteca en tiempo de ejecución.


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

En ese caso, debe averiguar cómo obtener la versión correcta en su máquina.


Prefiero vincular estáticamente con / MT.

Aunque obtienes un ejecutable más pequeño con / MD, aún tienes que enviar un montón de archivos DLL para asegurarte de que el usuario obtenga la versión correcta para ejecutar tu programa. Y al final su instalador va a ser MÁS GRANDE que cuando se vincula 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 va a instalar una nueva aplicación con diferentes bibliotecas y, con mala suerte, romperá su aplicación.


Si está compilando ejecutable que usa otros dlls o libs, se prefiere la opción / MD porque de esa forma 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 más que la llamada de alguien. La diferencia no es demasiado ahora porque el aspecto de compartir no está en juego.

Así que tal vez pueda iniciar la aplicación con / MT ya que no hay una razón convincente, pero cuando llega el momento de agregar una lib o dll, puede cambiarla a / MD con la de lib / dll, que es fácil.


Si está utilizando DLL, entonces debería ir a la CRT enlazada dinámicamente (/ MD).

Si usa 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 solo montón de CRT y la memoria asignada en un .exe / .dll se puede liberar en 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 para que la memoria se libere en el mismo módulo en el que se encuentra. fue asignado. También sufrirá la saturación del código (varias copias de la CRT) y el exceso de sobrecarga en el tiempo de ejecución (cada montón asigna memoria desde el sistema operativo para hacer un seguimiento de su estado, y la sobrecarga puede ser notable).


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

/ MT Define _MT para que las versiones específicas de subprocesos múltiples de las rutinas de tiempo de ejecución se seleccionen de los archivos de encabezado estándar (.h). Esta opción también hace que el compilador coloque el nombre de la biblioteca LIBCMT.lib en el archivo .obj para que el vinculador use LIBCMT.lib para resolver los símbolos externos. O bien / MT o / MD (o sus equivalentes de depuración / MTd o / MDd) son necesarios para crear programas multiproceso.

/ MD Define _MT y _DLL para que se seleccionen tanto las versiones multirread como las específicas de DLL de las rutinas de tiempo de ejecución de los archivos .h estándar. Esta opción también hace que el compilador coloque el nombre de la biblioteca MSVCRT.lib en el archivo .obj.

Las aplicaciones compiladas con esta opción están vinculadas estáticamente a MSVCRT.lib. Esta biblioteca proporciona una capa de código que permite al vinculador resolver referencias externas. El código de trabajo real está contenido en MSVCR71.DLL, que debe estar disponible en tiempo de ejecución para las aplicaciones vinculadas con MSVCRT.lib.

Cuando / MD se utiliza con _STATIC_CPPLIB definido (/ D_STATIC_CPPLIB) hará que la aplicación se vincule con la biblioteca multitoma estática estándar C ++ (libcpmt.lib) en lugar de la versión dinámica (msvcprt.lib) mientras se enlaza dinámicamente con el CRT principal a través de msvcrt.lib.

Entonces, si lo estoy interpretando correctamente, entonces / MT enlaza estáticamente y / MD enlaces dinámicamente.