Parece que toda mi vida adulta me ha atormentado porque el enlazador de VC++ se queja o se niega porque varias bibliotecas no están de acuerdo con qué versión de la biblioteca de Runtime usar. Nunca estoy de humor para dominar ese tema deprimente. Así que solo trato de meterme con eso hasta que funcione. Los mensajes de error nunca son útiles. Tampoco es la documentación de Microsoft sobre el tema, al menos para mí.La biblioteca de tiempo de ejecución no coincide y VC++ - ¡Oh, la miseria!
A veces no encuentra funciones, porque el cambio de nombre no es el esperado? A veces se niega a mezclar y combinar. Otras veces solo dice, "LINK: advertencia LNK4098: defaultlib 'LIBCMTD' entra en conflicto con el uso de otras librerías; use/NODEFAULTLIB: library" Usar/NODEFAULTLIB no funciona, pero la advertencia parece ser benigna. ¿Qué diablos es "DEFAULTLIB" de todos modos? ¿Cómo decide el vinculador? Nunca he visto una forma de especificar al enlazador qué biblioteca de tiempo de ejecución utilizar, solo cómo decirle al compilador para qué biblioteca crear llamadas de función.
Existen programas de "walker de dependencias" que pueden inspeccionar archivos de objetos para ver de qué DLL dependen. Acabo de ejecutar uno en un proyecto que estoy tratando de construir, y es un verdadero desastre. Hay sistemas .libs y .dll que desean versiones en tiempo de ejecución conflictivas. Por ejemplo, COMCTL32.DLL quiere MSVCRT.DLL, pero estoy enlazando con MSVCRTD.DLL. Estoy buscando para ver si hay un COMCTL32D.DLL, incluso mientras escribo.
Así que supongo que lo que estoy pidiendo es un tutorial sobre cómo resolver esas cosas. ¿Qué haces y cómo lo haces?
Esto es lo que creo que sé. Por favor corrígeme si algo de esto está mal.
Los parámetros son Debug/Release, Multi-threaded/Single-threaded, y static/DLL. Solo seis de las ocho combinaciones posibles están cubiertas. No hay DLL de subproceso único, ya sea Debug o Release.
La configuración solo afecta a qué biblioteca de tiempo de ejecución se vincula (y la convención de llamadas para vincularse con ella). Por ejemplo, no tiene que utilizar un tiempo de ejecución basado en DLL si está compilando un archivo DLL, ni tiene que utilizar una versión de depuración del tiempo de ejecución al compilar la versión de depuración de un programa, aunque parece ser útil cuando solo pasando las llamadas al sistema.
Pregunta adicional: ¿Cómo puede alguien o cualquier empresa crear un desastre?
¡Excelente! Creo que entiendo, pero me reservo el derecho de hacer preguntas cuando inevitablemente descubro que no. Por cierto, en el proyecto en el que estoy trabajando ahora, estoy logrando que tanto Release como Debug se vinculen y se ejecuten, pero la versión de lanzamiento me dice: "LINK: advertencia LNK4098: defaultlib 'LIBCMT' entra en conflicto con el uso de otras libs;/NODEFAULTLIB: biblioteca. " Esto es confuso para mí, porque he seleccionado Multi-threaded-DLL para la generación de código (/ MD). La versión de depuración enlaza clean. Estoy vinculando con wxWidgets, lcms, opencv y cualquier otra cosa que atraiga. ¡Adelante a través de la niebla! –
He descubierto cómo usar "/ NODEFAULTLIB: libray" en vigencia con el IDE de VC++. Abra "Propiedades" y luego la página "Enlazador/Entrada". Ponga el nombre del delincuente DEFAULTLIB en el cuadro de texto "Ignorar biblioteca específica". –