vscode visual tag studio instalar color code closing brackethighlighter visual-studio dll linker warnings msvcrt

visual-studio - instalar - visual studio code highlight closing tag



Resolviendo LNK4098: defaultlib ''MSVCRT'' entra en conflicto con (5)

Haga clic derecho en el proyecto, seleccione Propiedades luego en ''Propiedades de configuración | Linker | Entrada | Ignorar biblioteca específica y escribir msvcrtd.lib

Esta advertencia:

LINK : warning LNK4098: defaultlib ''MSVCRT'' conflicts with use of other libs; use /NODEFAULTLIB:library

es una advertencia bastante común en Visual Studio. Me gustaría entender la razón exacta y la forma correcta (si es que lo hace) para manejarlo.

Esto aparece en una compilación de depuración, compilada con /MDd . El proyecto está vinculado a cosas como Windows Version.dll y pdh.dll que a su vez se vinculan con MSVCRT.dll . Obviamente, no tengo las versiones de depuración de estos y no puedo compilarlos.

Así que agregué /NODEFAULTLIB:MSVCRT a la línea de comando del enlazador y realmente eliminó la advertencia. Pero, ¿qué hace esto realmente? ¿Y por qué es necesario?


Hay 4 versiones de las bibliotecas de enlaces CRT presentes en vc / lib:

  • libcmt.lib: biblioteca de enlaces CRT estáticos para una compilación de lanzamiento (/ MT)
  • libcmtd.lib: biblioteca de enlaces CRT estáticos para una compilación de depuración (/ MTd)
  • msvcrt.lib: biblioteca de importación para la versión DLL de lanzamiento del CRT (/ MD)
  • msvcrtd.lib: biblioteca de importación para la versión DLL de depuración del CRT (/ MDd)

Mire las opciones del enlazador, Project + Properties, Linker, Command Line. Tenga en cuenta cómo estas bibliotecas no se mencionan aquí. El vinculador calcula automáticamente qué / M modificador utilizó el compilador y qué .lib debería vincularse a través de una directiva #pragma comment. Algo importante, obtendría errores de enlace horribles y sería difícil diagnosticar los errores de tiempo de ejecución si hubiera una discrepancia entre la opción / M y la .lib con la que se vincula.

Verá el mensaje de error que citó cuando se le dice al vinculador que debe vincular 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 del CRT.

/ NODEFAULTLIB le dice al vinculador que ignore la directiva #pragma comment que se generó a partir del código compilado / MT. Esto podría funcionar, aunque una gran cantidad de otros errores de enlazador no es poco común. Cosas como errno , que es un int externo en la versión CRT estática pero macro-ed a una función en la versión DLL. Muchos otros así.

Bueno, arregle este problema de la manera correcta, encuentre el archivo .obj o .lib que está vinculando que se compiló con la opción incorrecta / M. Si no tiene ni idea, puede encontrarlo colocando 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).


Lo entiendo cada vez que quiero crear una aplicación en VC ++.

Haga clic derecho en el proyecto, seleccione Propiedades luego en ''Propiedades de configuración | C / C ++ | Generación de código '', seleccione "Depuración multiproceso (/ MTd)" para la configuración de depuración.

Tenga en cuenta que esto no cambia la configuración de su configuración de versión. Deberá dirigirse a la misma ubicación y seleccionar "Multi-threaded (/ MT)" para la versión.


OMI este enlace de fue muy bueno y relevante, pero doloroso de leer. Escribí un resumen.

Yochai, si alguna vez lees esto, mira la nota al final.

Para la lectura de la publicación original: advertencia LNK4098: defaultlib "LIBCD" entra en conflicto con el uso de otras librerías

Error

LINK: advertencia LNK4098: defaultlib "LIBCD" entra en conflicto con el uso de otras librerías; use / NODEFAULTLIB: biblioteca

Sentido

una parte del sistema se compiló para usar una biblioteca estándar de un solo hilo (libc) con información de depuración (libcd) que está estáticamente vinculada

mientras que otra parte del sistema fue compilada para usar una biblioteca estándar multiproceso sin información de depuración que reside en una DLL y usa enlaces dinámicos

Cómo resolverlo

  • Ignora la advertencia, después de todo, es solo una advertencia. Sin embargo, su programa ahora contiene múltiples instancias de las mismas funciones.

  • Utilice la opción del vinculador / NODEFAULTLIB: lib. Esta no es una solución completa, incluso si puede lograr que su programa se vincule de esta manera ignorando una señal de advertencia: el código ha sido compilado para diferentes entornos, parte de su código puede ser compilado para un modelo de un solo subproceso mientras que otro código es multihilo.

  • [...] navegue por todas sus bibliotecas y asegúrese de que tengan la configuración de enlace correcta.

En este último, como se menciona en la publicación original, pueden surgir dos problemas comunes:

  • Usted tiene una biblioteca de terceros que está vinculada de manera diferente a su aplicación.

  • Tiene otras directivas incrustadas en su código: normalmente este es el MFC. Si algún módulo de su sistema se vincula con MFC, todos sus módulos deben vincularse nominalmente con la misma versión de MFC.

Para esos casos, asegúrese de comprender el problema y decidir entre las soluciones.

Nota: Quería incluir ese resumen del enlace de Yochai Timmer en su propia respuesta, pero como algunas personas tienen problemas para revisar las ediciones correctamente, tuve que escribirlo en una respuesta separada. Lo siento