2010-12-02 9 views
5

que tiene un proyecto de DLL en el que, cuando está en configuración Release construyo el proyecto, me sale el siguiente aviso:Visual Studio LNK4098 de advertencia enlazador

MSVCRT.LIB (cinitexe.obj): testigo LNK4098: defaultlib 'msvcrtd.lib' conflictos con el uso de otras bibliotecas; utilizar /NODEFAULTLIB: Biblioteca

Es sólo una advertencia pero no sé si esto debe ser tenido en cuenta.

Por lo que he descubierto, ambas son bibliotecas multiproceso, versiones normales y de depuración. Mi DLL utiliza múltiples hilos y puedo depurarlo, aunque yo uso impulso: hilo para ello, por lo que realmente sé si necesito esta librerías específicas de Windows para la depuración o la liberación de construcción ...

Saludos cordiales, Alex

Bueno, hice lo que sugirió BuschnicK y con el/VERBOSE: bandera enlazador LIB descubrí que estaba ligando a estas bibliotecas en la configuración de depuración:

boost_filesystem-VC100-mt-gd-1_44.lib: libboost_system- vc100-mt-gd-1_44.lib: libboost_thread-vc100-mt-gd-1_44.lib: libboost_date_time-vc100-mt-gd-1_44.lib:

Tuve el mismo en la configuración de liberación, sobre todo porque no especificó entonces "explícitamente". Por lo tanto, les cambió a esto en lanzamiento:

boost_filesystem-VC100-mt-1_44.lib: libboost_system-VC100-mt-1_44.lib: libboost_thread-VC100-mt-1_44.lib: libboost_date_time-VC100 -mt-1_44.lib:

Parece que funcionó, pero todavía recibía la primera advertencia, hasta que me di cuenta de que también tenía la definición del preprocesador _DEBUG en la configuración de Release, la eliminé y está funcionando bien ahora.

¡Gracias a todos por la ayuda!

Respuesta

7

Parece que podría estar ejecutando una biblioteca de depuración y una biblioteca compilada en la misma compilación.

Revise las opciones de su proyecto y seleccione para usar las versiones de depuración de cualquier biblioteca de terceros que utilice.

+0

La única biblioteca de refuerzo que estoy usando requiere que lib enlace es el sistema de archivos, que, hsa dos versiones: – AlejandroVK

+0

Olvide el último comentario: La única biblioteca de refuerzo que estoy usando requiere enlaces lib es el sistema de archivos, que, hsa dos versiones: boost_filesystem-vc100-mt-gd-1_44.lib, boost_filesystem-vc100-mt-1_44.lib. Supongo que el primero es para la depuración multihilo, y el segundo solo mt. Nunca he especificado en mis opciones de enlazador cuál elegir, lo hace "automáticamente" ... ¿podría ser esta la fuente de los problemas? – AlejandroVK

10

Se dice cuál es el problema justo en el mensaje si se lee con atención: "MSVCRT.LIB" vs "MSVCRTD.LIB"

Aviso el añadido "d" en el segundo nombre de la biblioteca. Lo que sucede es que estás enlazando el tiempo de ejecución de Visual Studio C++ (MSVCRT) estáticamente. Una de sus bibliotecas está tirando de la versión de lanzamiento de esa lib mientras que otra está tirando de la versión de depuración (de ahí el postfix "d"). El enlazador le dice que ambas bibliotecas definen funciones con el mismo nombre, están en conflicto y, por lo tanto, una de ellas se descarta automáticamente.

Para solucionar esto, revise la configuración de compilación de todos sus proyectos/bibliotecas y asegúrese de que estén utilizando las mismas bibliotecas de tiempo de ejecución para todas las configuraciones de compilación. Mire en project properties ->C/C++ ->Code Generation ->Runtime Library. Esto probablemente debería decir "multi-threaded" para compilaciones de versiones y "debug multi-threaded" para compilaciones de depuración.

Tenga en cuenta que, en general, se considera una mala práctica vincular está bibliotecas de forma estática y que debe preferir las versiones dll vinculadas dinámicamente.

+0

MSVCRT ya es la versión dinámica. Todavía tiene que vincular a esto, aunque es a través de una biblioteca de exportación. http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.100).aspx –

+0

Lo siento mal. Estas en lo correcto, por su puesto. El resto de la respuesta aún debería ser correcta. – BuschnicK

+0

Hmmmmm, he comprobado ambas configuraciones, en Debugger -> DLL de depuración de subprocesos múltiples (/ MDd) y en Versión -> DLL de subprocesos múltiples (/ MD), y sigo recibiendo la advertencia, ¿tengo que usar/NODEFAULTLIB: MSVCRTD.LIB para la configuración de lanzamiento? – AlejandroVK

Cuestiones relacionadas