Pregunta

Después de pasar por un largo proceso para cambiar el nombre de un proyecto, mi proyecto DLL no se va a construir en modo de depuración (versión se basa el trabajo):

MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)

Este proyecto, y las cinco bibliotecas estáticas de los que depende, se establecen para usar "depuración multi-hilo (/ MTD)" (en C / C ++ | Generación de código | Runtime Library). Creo LIBCMTD.LIB es el de depuración multi-hilo, pero lo que es MSVCRTD.lib, y lo que podría ser la causa de este error?

Si se hace una diferencia, esta DLL es para Windows CE.

¿Fue útil?

Solución

LIBCMT es lo que necesita para / MT, MSVCRT es lo que necesita para / MD. Está vinculando .obj y .lib que se mezclan, algunos compilados con / MT algunos con / MD. Eso no es bueno.

Por lo general, se trata de los archivos .lib que causan el problema. Revisar sus configuraciones de generación y asegurarse de que su opción / M es el mismo que su proyecto DLL.

Además, tenga cuidado de los problemas que puede entrar en si el archivo DLL se compila con / MT. Vas a tener grandes problemas cuando la DLL devuelve los punteros a objetos que el cliente necesite para liberar. No puede, no utilizar el mismo asignador de memoria.

Otros consejos

El artículo de MSDN sobre LNK4098 tiene una tabla muy útil: te dice que las bibliotecas para añadir manualmente a la lista "Ignorar biblioteca específica", dependiendo de la CRT que está utilizando. En su caso, usted debe pasar por alto todo esto:

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

Tenga en cuenta que la biblioteca informado está en esta lista también. El problema se describe con más detalle en KB154753 ... bibliotecas que un programa se vinculará con cuando se construyó utilizando Visual C ++

Mi interpretación de esto es que en ciertas situaciones el algoritmo que selecciona automáticamente qué bibliotecas CRT para enlazar el código con recogerá varias bibliotecas en conflicto.

Lo que se establece la liberación también? El establecimiento de una DLL de depuración multiproceso puede causar problemas si se asigna memoria que algo accesing la DLL intenta liberar (que serán asignados en diferentes montones, por ejemplo). Pruebe a establecer multi-threaded DLL de depuración.

Su vínculo problema probablemente se debe a que una biblioteca que está vinculando a la espera de depuración DLL multiproceso por lo que el enlazador intenta vincular ambos y su enlace falla ...

El problema es la msvcr90d.dll no es la imagen de Windows CE en. Se debe implementarse con la aplicación. El msvcr90d.dll se encuentra en $ (VCInstallDir) / ce / bin / $ (ARCHFAM).

http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd

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