2010-03-29 13 views
13

Tengo una solución en VS 2008 que crea una DLL. Luego uso esa DLL en otra aplicación. Si voy a las páginas de propiedades de los proyectos DLL y cambio la siguiente configuración para una construcción DEBUG entonces el dll generado no proporciona la funcionalidad deseada. Si cambio de nuevo y reconstruir el archivo DLL, a continuación, la DLL proporciona la funcionalidad correcta:¿Qué hace exactamente la opción "Biblioteca de tiempo de ejecución de DLL con subprocesos múltiples" en VS 2008?

Páginas de propiedades => Propiedades de configuración => C/C++ => Generación de código => Tiempo de ejecución Biblioteca

Si conjunto a "DLL de depuración de varios subprocesos (/ MDd)" y todo funciona como debería. Me da la correcta funcionalidad de la DLL

Si se establece en "DLL multiproceso (/ MD)" continuación, la DLL no funciona correctamente ... no hay errores de ejecución ni nada, simplemente no lo hace trabajo (se supone que el archivo DLL traza algunas líneas en un mapa, pero no en este modo).

Entonces, la pregunta es, ¿por qué usar el indicador/MDd da como resultado la funcionalidad de corrección del código subyacente, mientras que/MD da como resultado una funcionalidad incorrecta?

Un poco de historia ... alguien más desarrolló la DLL en C++ y estoy usando esta DLL en una aplicación VB.net.

Respuesta

9

Todos los DLL/generación de código de depuración deben coincidir en todo lo que los utiliza. Puede haber otra biblioteca u objeto referenciado o dll o algún código allí construido con las opciones incorrectas; o opciones específicas para un elemento individual que anulan las opciones globales del proyecto.

La única manera de resolverlo es revisar meticulosamente todas las opciones para cada archivo, verificando las bibliotecas incluidas (incluidas) y referenciadas (.lib y .dll) y los archivos objeto. Verifique las opciones del enlazador también.

La razón por la que no funciona es probablemente porque la versión de depuración agrega bloques de protección extra alrededor de la memoria para permitir la detección de errores.

6

La principal diferencia entre las dos opciones se encuentra en las bibliotecas que su código se vincularán al posterior. para la versión de depuración, por ejemplo, esto incluirá LIBCMTD.LIB y algunos otros. si su biblioteca se construirá como depuración, siempre se debe vincular con MDd. De lo contrario, se producirán muchos errores de enlazador externo no resueltos en el mejor de los casos. y a veces el código se compila normalmente pero se bloquea en tiempo de ejecución. si esto sucede en vb.net, una captura puede ocultar fácilmente el error. Supongo que deberías asegurarte de que la configuración de la construcción sea correcta. para obtener información más detallada, consulte this.

4

Tuve problemas similares. Mi aplicación que "usó" un DLL de terceros se colgó cuando su biblioteca de tiempo de ejecución se estableció en "DLL de subprocesos múltiples (/ MD)", pero funcionó cuando su biblioteca de tiempo de ejecución se estableció en "DLL de depuración de subprocesos múltiples (/ MDd)".

Tiene algo que ver con pasar std :: strings y std :: lists a través de la interfaz DLL.

Nuestra suposición era la definición de bajo nivel de este tipo era de alguna manera diferente en las dos bibliotecas de tiempo de ejecución.

Resolvimos nuestros problemas relacionados usando esta regla ... La DLL y el usuario de DLL deben compilarse utilizando la misma biblioteca de tiempo de ejecución.

Cuestiones relacionadas