c++ visual-c++ gcc backwards-compatibility itanium-abi

Compilador GCC vs MS C++ para mantener la compatibilidad binaria con versiones anteriores de API



visual-c++ backwards-compatibility (3)

Vengo del mundo de Linux y conozco muchos artículos sobre cómo mantener la compatibilidad binaria (BC) de una API de biblioteca dinámica escrita en lenguaje C ++. Uno de ellos es "Políticas / Problemas de compatibilidad binaria con C ++" basado en el ABI de Itanium C ++ , que es utilizado por el compilador GCC. Pero no puedo encontrar nada similar para el compilador de Microsoft C ++ (de MSVC).

Entiendo que la mayoría de las técnicas son aplicables al compilador de MS C ++ y me gustaría descubrir problemas específicos del compilador relacionados con las diferencias ABI (diseño de v-table, manipulación, etc.)

Entonces, mis preguntas son las siguientes:

  • ¿Conoce alguna diferencia entre los compiladores de MS C ++ y GCC al mantener BC?
  • ¿Dónde puedo encontrar información sobre MS C ++ ABI o sobre el mantenimiento de BC de API en Windows?

Cualquier información relacionada será altamente apreciada.
¡Muchas gracias por tu ayuda!


En Windows, básicamente tienes 2 opciones para la compatibilidad binaria a largo plazo:

  1. COM
  2. imitando a COM

Echa un vistazo a mi post aquí. Allí verá una forma de crear DLL y acceder a DLL de forma binaria en diferentes compiladores y versiones de compilador.

Interfaz de plugin DLL C ++


En primer lugar, estas políticas son generales y no se refieren solo a gcc. Por ejemplo: la marca privada / pública en funciones es algo específico de MSVC y no de gcc.

Básicamente, estas reglas son completamente aplicables a MSVC y también al compilador general.

Pero...

Usted debe recordar:

  1. GCC / C ++ mantiene su ABI estable desde la versión 3.4 y dura aproximadamente 7 años (desde 2004), mientras que MSVC rompe su ABI en todas las versiones principales: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) no son compatibles entre sí.
  2. Algunos indicadores que se usan con frecuencia con MSVC también pueden romper ABI (como el modelo de excepciones)
  3. MSVC tiene tiempos de ejecución incompatibles para los modos Debug y Release.

Entonces sí, puedes usar estas reglas, pero como en el caso habitual de MSVC, tiene muchas más peculiaridades.

Consulte también " Algunas reflexiones sobre la compatibilidad binaria " y Qt mantiene su ABI estable con MSVC también.

Tenga en cuenta que tengo algo de experiencia con esto ya que sigo estas reglas en CppCMS


La mejor regla para la compatibilidad binaria de MSVC es usar una interfaz C. La única característica de C ++ con la que puede salirse, según mi experiencia, son las interfaces de herencia única. Así que representan todo como interfaces que utilizan tipos de datos C.

Aquí hay una lista de cosas que no son compatibles con binarios:

  • El STL. El formato binario cambia incluso entre depuración / lanzamiento, y dependiendo de los indicadores del compilador, por lo que es mejor no usar el módulo cruzado STL.
  • Muchísimo. No malloc / malloc en un módulo y delete / free en otro. Hay diferentes montones que no se conocen unos de otros. Otra razón por la que el STL no funciona en módulos cruzados.
  • Excepciones. No permita que las excepciones se propaguen de un módulo a otro.
  • Tipos de datos RTTI / dynamic_casting de otros módulos.
  • No confíe en ninguna otra característica de C ++.

En resumen, C ++ no tiene ABI coherente, pero C sí, así que evite los módulos de cruce de funciones de C ++. Debido a que la herencia única es una tabla v simple, puede usarla útilmente para exponer objetos de C ++, siempre que utilicen tipos de datos C y no realicen asignaciones cruzadas. Este es el enfoque utilizado por Microsoft también, por ejemplo, para la API Direct3D. GCC puede ser útil para proporcionar un ABI estable, pero el estándar no lo requiere, y MSVC aprovecha esta flexibilidad.