Hay 4 versiones de las bibliotecas de enlaces CRT presentes en vc \ lib:
- libcmt.lib: biblioteca estática de enlaces CRT para una compilación de lanzamiento (/ MT)
- libcmtd.lib: biblioteca de enlaces CRT estática para una compilación de depuración (/ MTd)
- msvcrt.lib: biblioteca de importación para la versión de lanzamiento DLL del CRT (/ MD)
- msvcrtd.lib: biblioteca de importación para la versión DLL de depuración del CRT (/ MDd)
Mire las opciones del vinculador, Proyecto + Propiedades, Vinculador, Línea de comando. Observe cómo estas bibliotecas no se mencionan aquí. El vinculador descubre automáticamente qué modificador / M utilizó el compilador y qué .lib debería vincularse a través de una directiva de comentario #pragma. Un poco importante, obtendría errores de enlace horribles y errores de tiempo de ejecución difíciles de diagnosticar si hubiera una discrepancia entre la opción / M y el .lib con el que se vincula.
Verá el mensaje de error que citó cuando se le indica al vinculador que se vincule a msvcrt.lib y libcmt.lib. Lo que sucederá si vincula el código que se compiló con / MT con el código que se vinculó con / MD. Solo puede haber una versión de la CRT.
/ NODEFAULTLIB le dice al enlazador que ignore la directiva de comentario #pragma que se generó a partir del código compilado / MT. Esto podría funcionar, aunque una serie de otros errores de enlazador no es infrecuente. Cosas como errno , que es un int externo en la versión estática de CRT pero macro-ed a una función en la versión DLL. A muchos otros les gusta eso.
Bueno, solucione este problema de la manera correcta, busque el archivo .obj o .lib que está vinculando que se compiló con la opción incorrecta / M. Si no tiene ni idea, puede encontrarlo agrupando los archivos .obj / .lib para "/ MT"
Por cierto: los ejecutables de Windows (como version.dll) tienen su propia versión CRT para hacer su trabajo. Se encuentra en c: \ windows \ system32, no puede usarlo de manera confiable para sus propios programas, sus encabezados CRT no están disponibles en ninguna parte. La DLL CRT utilizada por su programa tiene un nombre diferente (como msvcrt90.dll).