Pregunta

Tengo una gran cantidad de código, compilado con / MT (es decir, esperando estáticamente enlace contra el CRT). Necesito combinar esto con una biblioteca de terceros estática, que ha sido construido con / MD (es decir, esperando para enlazar dinámicamente el CRT).

Es teóricamente posible vincular los dos un solo ejecutable sin recompilar tampoco?

Si vinculo con / NODEFAULTLIB: msvcrt, que termina con un pequeño número de referencias indefinidas a cosas como __imp__wgetenv. Estoy tentado a probar la aplicación de dichas funciones en mi propio código, el reenvío a wgetenv, etc. está tratando de que vale la pena, o voy a correr directamente hacia el siguiente problema?

Por desgracia tengo prohibido tomar la opción fácil de empaquetar el código thirdparty en una DLL independiente: - /

¿Fue útil?

Solución

No. / MT y / MD son mutuamente excluyentes.

  

Todos los módulos pasados ??a una invocación dada del enlazador debe haber sido compilado con la misma opción de la biblioteca del compilador en tiempo de ejecución ( / MD , / TM , / LD ).

Fuente

Otros consejos

He encontrado solución de este tipo en las fuentes de OpenSSL: Todos los obj archivos de la biblioteca son recopilados con la combinación: /MT /Zl . Como autor describió, tal combinación permite construir biblioteca estática con capacidad de compilar con las aplicaciones, ya sea CRT dinámica (/MD) o CRT estático (/MT).

Me enfrentó situación similar, donde en tuve dos bibliotecas se construyó con MT y otro con MD. Tenía que construir un ejecutable que utiliza funcionalidades tanto de las bibliotecas. La biblioteca construida como MD fue tercero por lo tanto no podía reconstruido y una biblioteca construida como MT tiene muchas dependencias y construido todos ellos, MD es un gran dolor. Que estaba recibiendo de error desde el tercer archivo de cabecera de configuración partido que hizo obligatorio para construir el ejecutable como MD. Yo estaba buscando la manera fácil de envases tercer partido DLL como un archivo DLL separada como se ha mencionado en cuestión. Sin embargo, no pude encontrar una explicación suficiente en línea en este camino fácil. De ahí mis dos centavos por debajo. La siguiente es la forma en que la eluden

  1. I construyó otra .dll que actuó como una interfaz. Esta interfaz básicamente envuelve todas las llamadas a la API que se hizo para el tercer partido de DLL. El archivo de cabecera para esta interfaz no incluye ningún archivo de cabecera de la tercera parte de DLL en vez todos esos archivos de cabecera se incluyen en el archivo interface.cpp. Interfaz como se esperaba fue construido como MD.
  2. Ahora En mi archivo main.cpp que incluye este archivo de cabecera interfaz para hacer todas las llamadas a DLL tercera parte a través de la interfaz.

  3. El cuidado adicional tiene que ser tomada en el paso de argumentos a la interfaz. variables básicas como int, bool, etc se pueden pasar como valor. Sin embargo, cualquier necesidades de estructura de clases o para pasar como referencia const a la corrupción evitar montón. Esto es aplicable a la cadena aun.

feliz de compartir más detalles si no está claro!

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