Pregunta

Vengo del mundo de Linux y conozco muchos artículos sobre el mantenimiento de la compatibilidad binaria hacia atrás (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 Itanium c ++ abi, 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 MS C ++ y me gustaría descubrir compilador específico Problemas relacionados con las diferencias ABI (diseño de la mesa V, desglose, etc.)

Entonces, mis preguntas son las siguientes:

  • ¿Conoces alguna diferencia entre los compiladores 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á muy apreciada.
¡Muchas gracias por tu ayuda!

¿Fue útil?

Solución

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

Por lo tanto, básicamente estas reglas son totalmente aplicables a MSVC y el compilador general también.

Pero...

Deberías recordar:

  1. GCC/C ++ mantiene su ABI estable desde el lanzamiento de 3.4 y son aproximadamente 7 años (desde 2004), mientras que MSVC rompe su ABI cada lanzamiento importante: MSVC8 (2005), MSVC9 (2008), MSVC10 (2010) no son compatibles entre sí.
  2. Algunas banderas con frecuencia utilizadas con MSVC también pueden romper ABI (como el modelo de excepciones)
  3. MSVC tiene tiempos de ejecución incompatibles para los modos de depuración y lanzamiento.

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

Ver también "Algunos pensamientos sobre la compatibilidad binaria"Y QT también mantiene el establo con MSVC también.

Tenga en cuenta que tengo algo de experiencia con esto mientras sigo estas reglas en CPPCMS

Otros consejos

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

  1. Comunicarse
  2. imitando com

Mira mi publicación aquí. Allí verá una manera de crear DLL y acceder a DLL de una manera binaria compatible en diferentes compiladores y versiones de compiladores.

Interfaz del complemento C ++ DLL

La mejor regla para la compatibilidad binaria MSVC es usar una interfaz C. La única característica de C ++ con la que puedes escapar, en mi experiencia, son las interfaces de herencia única. Por lo tanto, represente todo como interfaces que usan tipos de datos C.

Aquí hay una lista de cosas que son no Compatible binario:

  • El stl. El formato binario cambia incluso entre la depuración/liberación, y dependiendo de las banderas del compilador, por lo que es mejor que no use STL Crossmodule.
  • Muchísimo. No haga new / malloc en un módulo y delete / free en otro. Hay diferentes montones que no saben el uno del otro. Otra razón por la que el STL no funcionará multiplicados.
  • Excepciones. No dejes que las excepciones se propagan de un módulo a otro.
  • RTTI/Dynamic_casting DataTypes de otros módulos.
  • No confíe en otras características de C ++.

En resumen, C ++ no tiene ABI consistente, pero C sí, por lo tanto, evite los módulos de cruce de C ++ características. Debido a que la herencia única es una tabla V simple, puede usarla de manera útil para exponer objetos C ++, siempre que usen los tipos de datos C y no realicen asignaciones a fondo. Este es el enfoque utilizado también por Microsoft, por ejemplo, para la API DIRECT3D. GCC puede ser útil para proporcionar un ABI estable, pero el estándar no requiere esto, y MSVC aprovecha esta flexibilidad.

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