2010-08-12 13 views
6

Tengo un gran cuerpo de código, compilado con/MT (es decir, esperando vincular estáticamente contra el CRT). Necesito combinar esto con una biblioteca estática de terceros, que se ha creado con/MD (es decir, esperando vincular el CRT dinámicamente).código de mezcla compilado con/MT y/MD

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

Si enlace con/nodefaultlib: msvcrt, termino con un pequeño número de referencias indefinidas a cosas como __imp__wgetenv. Estoy tentado de intentar implementar esas funciones en mi propio código, reenviando al wgetenv, etc. ¿Vale la pena intentarlo, o voy a pasar directamente al siguiente problema?

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

Respuesta

3

Nº/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 compilador biblioteca de tiempo de ejecución (/MD, /MT, /LD).

Source

+0

No era la respuesta que esperaba, pero gracias ;-) – slowdog

0

He encontrado esta solución en las fuentes de OpenSSL: Todos los archivos OBJ de la biblioteca son recopilados con la combinación: /MT/Zl. Como el autor describió, tal combinación permite construir una biblioteca estática con capacidad para compilar aplicaciones CRT dinámico (/MD) o CRT estático (/MT).

0

Me enfrenté a una situación similar en la que tenía dos bibliotecas, una con MT y otra con MD. Tuve que construir un archivo ejecutable que utiliza funcionalidades de ambas bibliotecas. La biblioteca construida como MD era de terceros, por lo que no pude reconstruirla y la biblioteca construida como MT tiene muchas dependencias y construir todas ellas como MD es un gran problema. Estaba obteniendo un error del archivo de encabezado de configuración de terceros que hacía obligatorio construir el ejecutable como MD. Estaba buscando la manera fácil de empaquetar dll de terceros como un dll separado como se menciona en la pregunta. Sin embargo, no pude encontrar suficiente explicación en línea de esta manera fácil. De ahí mis dos centavos a continuación. La siguiente es la forma en que la eluden

  1. I construyó otra .dll que actuó como una interfaz. Esta interfaz básicamente envolvió todas las llamadas de API que se hicieron a dll de terceros. El archivo de encabezado para esta interfaz no incluía ningún archivo de encabezado de dll de terceros sino que todos esos archivos de encabezado se incluyeron en el archivo interface.cpp. La interfaz como esperabas se construyó como MD.
  2. Ahora en mi archivo main.cpp incluí este archivo de encabezado de interfaz para realizar todas las llamadas a dll de terceros a través de la interfaz.

  3. Se debe tener especial cuidado al pasar argumentos a la interfaz. Las variables básicas como int, bool, etc. se pueden pasar como valor. Sin embargo, cualquier clase o estructura debe pasarse como referencia constante para evitar la corrupción del montón. Esto es aplicable a una cuerda pareja.

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

Cuestiones relacionadas