Pregunta

Esta es una aplicación de consola de Windows (en realidad un servicio) que un chico anterior creó hace 4 años y está instalada y ejecutándose. ¡Ahora necesito hacer algunos cambios pero ni siquiera puedo construir la versión actual! Aquí está el resultado de la compilación:

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

Si uso / NODEFAULTLIB , obtengo muchos errores. El código en realidad no usa _socket_noblock pero no puedo encontrar nada en la red. Presumiblemente es usado por alguna biblioteca a la que estoy enlazando pero no sé en qué biblioteca está.

--- Alistair.

¿Fue útil?

Solución 2

Lo sentimos, esto resulta ser un problema interno. Una combinación de un codificador inconformista hace 4 años y un no-nada oxidado (¡yo!) Ahora.

El código no usa _socket_noblock pero usa socket_noblock y solo necesito vincularme a una de nuestras propias bibliotecas.

Otros consejos

LNK4098 puede no ser un problema. Por ejemplo, puede ocurrir si se vincula con una versión de lanzamiento de alguna biblioteca que usa un enlace de tiempo de ejecución estático y hace que se agregue LIBCMT (tenga en cuenta la ausencia del sufijo '' D '') a las bibliotecas predeterminadas. Su aplicación, construida en la configuración de depuración, utiliza LIBCMT D , por lo tanto, el conflicto. Puede ser realmente seguro, siempre que no esté intercambiando nada dependiente del tiempo de ejecución con esa biblioteca.

En cuanto a _socket_noblock , puede usar alguna utilidad de búsqueda (como grep o find) para buscar esta cadena en archivos .obj y .lib. De esta manera, sabrá qué biblioteca hace referencia al símbolo, que puede ser un punto de partida para descubrir qué dependencias tiene esa biblioteca.

Puede usar " Dependency Walker " , una herramienta gratuita para encontrar las dependencias de su aplicación, para descubrir cómo se vincula su aplicación con libcmtd. Editar: no puede, por supuesto, usarlo en la nueva versión que no se puede vincular (ver comentarios), pero puede usarlo en la versión anterior, o en bibliotecas conocidas que la nueva versión enlaces con.

Sin embargo, como el problema real no estaba relacionado con nada de lo que sugerí, tal vez la pregunta debería cerrarse.

Parece que está vinculando a diferentes versiones de la CRT, posiblemente porque está utilizando bibliotecas compiladas antiguas junto con un nuevo compilador y una versión de la CRT.

defaultlib " LIBCMTD " conflictos con el uso de otras bibliotecas es una advertencia que indica que su programa usa una versión diferente de la biblioteca de tiempo de ejecución que una o más de sus bibliotecas. Use el mismo tiempo de ejecución en todo el programa y las bibliotecas para que la advertencia desaparezca.

(configuración del proyecto) (pestaña c ++) categoría (generación de código) (usar biblioteca de tiempo de ejecución)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top