¿Puedo usar una biblioteca de estilo C construida con VC6 directamente en el proyecto VC9?

StackOverflow https://stackoverflow.com/questions/1624648

  •  06-07-2019
  •  | 
  •  

Pregunta

Usamos una biblioteca interna (desarrollada por otro equipo) construida con el compilador VC6. Esta biblioteca contiene principalmente APIs de C Style. Tenemos un plan para migrar al compilador de Visual Studio 9. ¿Debo solicitar que la biblioteca se compile con el compilador VC9?

Una pregunta más genérica, ¿En qué puntos (pueden ser la manipulación de nombres, la optimización, etc.) una DLL creada con dos versiones diferentes del compilador de Visual Studio difiere?

¿Fue útil?

Solución

El conflicto usualmente ocurre en la biblioteca de C Runtime. La idea principal es que la memoria debe ser desasignada en el módulo donde fue asignada. Entonces será seguro usar la biblioteca que se construyó con una versión diferente del compilador. Otro problema es el empaquetado de estructuras, pero no tiene ninguna diferencia si usa solo el compilador de Visual C ++.

Mangling de nombre difiere de una versión a otra en Visual C ++, pero solo se aplica a Bibliotecas C ++. Si utiliza la exportación de estilo C (por ejemplo, si tiene un archivo DEF), entonces no hay nada de qué preocuparse.

Esta pregunta no es un duplicado completo de su, pero podría ser útil.

Otros consejos

AFAIK, la mutilación de nombres de Visual C ++ se ha mantenido estable de una versión a otra.

El problema principal es que el código compilado con una versión debe vincularse con la CRTL para esa versión, y la combinación de código de varias versiones en la misma DLL o EXE no funcionará porque ambos códigos de objeto esperan diferentes rutinas RTL.

Por otro lado, si vinculas archivos DLL separados que contienen las diferentes bibliotecas, debería funcionar. Después de todo, ese es el punto central de las DLL.

En ese escenario, recomendaría usar solo las API extern " C " y (si este es un código de 32 bits) especificando explícitamente la convención de llamada ( __stdcall__ o WINAPI o _cdecl ...)

Además, hay un problema sutil cuando tu aplicación tiene varias copias de la CRTL: ¡tienes múltiples montones! y si un objeto se asigna en un montón y se libera a un montón diferente, el montón se corrompe inmediatamente y se bloqueará.

En definitiva, si puedes compilarlos con tu compilador, eso es lo más simple.

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