tengo - ¿Puedes mezclar c++ compilado con diferentes versiones del mismo compilador?
como saber que version de c++ tengo (2)
Diferentes generaciones del mismo compilador a veces pueden ser compatibles entre sí, pero no siempre. Por ejemplo, GCC 4.7.0 cambió su C / C ++ ABI , lo que significa que las bibliotecas compiladas con 4.7.0+ y 4.7.0 probablemente no sean compatibles entre sí (por lo tanto, en su ejemplo, la biblioteca compilada con 4.6 no será Compatible con la librería compilada con 4.9). También puede haber errores ABI dentro de una versión de compilador dada, como sucedió en GCC 4.7.0 / 4.7.1 :
Las versiones 4.7.0 y 4.7.1 de GCC tuvieron cambios en la biblioteca estándar de C ++ que afectó a ABI en el modo C ++ 11: se agregó un miembro de datos a std :: list cambiando su tamaño y alterando las definiciones de algunas funciones miembro, y El constructor de movimientos de std :: pair no fue trivial, lo que modificó la convención de llamada para funciones con argumentos std :: pair o tipos de retorno. Las incompatibilidades ABI se han corregido para GCC versión 4.7.2, pero como resultado, el código C ++ 11 compilado con GCC 4.7.0 o 4.7.1 puede ser incompatible con el código C ++ 11 compilado con diferentes versiones de GCC y con C ++ Código 98 / C ++ 03 compilado con cualquier versión.
La página de políticas y pautas de ABI de GCC indica que intentan mantener la compatibilidad hacia adelante, pero no la compatibilidad hacia atrás:
El control de versiones ofrece a las versiones posteriores de los binarios de la biblioteca la capacidad de agregar nuevos símbolos y funcionalidad, al tiempo que mantiene la compatibilidad con las versiones anteriores de la serie. Por lo tanto, los binarios de programa vinculados con la versión inicial de un binario de biblioteca aún se ejecutarán correctamente si el binario de biblioteca es reemplazado por binarios de biblioteca subsiguientes cuidadosamente administrados. Esto se llama compatibilidad hacia adelante.
Lo contrario (compatibilidad hacia atrás) no es cierto. No es posible tomar programas binarios vinculados con la última versión de un binario de biblioteca en una serie de lanzamientos (con símbolos adicionales agregados), sustituir en el lanzamiento inicial del archivo binario de la biblioteca y seguir siendo compatible con los enlaces.
Esa página también tiene algunas explicaciones bastante extensas sobre el sistema de control de versiones que usa GCC para marcar diferentes versiones de los componentes dados, así como una explicación para el control de versiones detrás de GCC:
Cambios permitidos
Lo siguiente hará que el número de versión menor de la biblioteca aumente, por ejemplo, de "libstdc ++. So.3.0.4" a "libstdc ++. So.3.0.5".
Agregar un miembro de datos globales o estáticos exportados
Agregando una función exportada, miembro o función miembro no virtual
Agregando un símbolo o símbolos exportados por instancias adicionales
Otros cambios permitidos son posibles.
Cambios Prohibidos
La siguiente lista no exhaustiva hará que el número de versión principal de la biblioteca aumente, por ejemplo, de "libstdc ++. So.3.0.4" a "libstdc ++. So.4.0.0".
Cambios en el compilador gcc / g ++ ABI
Cambio de tamaño de un símbolo exportado
Cambio de alineación de un símbolo exportado
Cambiar el diseño de un símbolo exportado
Cambiando la manipulación de un símbolo exportado
Eliminar un símbolo exportado
Cambiar las propiedades de herencia de un tipo agregando o eliminando clases base
Cambiar el tamaño, la alineación o el diseño de los tipos especificados en el estándar de C ++. Estos no necesariamente pueden ser instanciados o exportados de otra manera en el binario de la biblioteca, e incluyen todas las facetas de locale requeridas, así como cosas como std :: basic_streambuf, et al.
Agregar un constructor o destructor de copia explícito a una clase que de otra manera tendría versiones implícitas. Esto cambiará la forma en que el compilador trata con esta clase en declaraciones o parámetros de retorno por valor: en lugar de pasar instancias de esta clase en registros, el compilador se verá obligado a usar la memoria. Consulte la sección sobre Convenciones de llamada de funciones y API de la documentación de ABI de C ++ para obtener más detalles.
Tenga en cuenta el bit en negrita. En un mundo perfecto, las versiones de GCC con el mismo número de versión principal serían compatibles con binarios. Este no es un mundo perfecto, así que pruébalo con mucho cuidado antes de mezclar versiones de compilador como esta, pero en general probablemente estarás bien.
Por ejemplo, podría mezclar un conjunto de bibliotecas compiladas en GCC-4.6 con GCC-4.9.
Soy consciente de que diferentes "razas" de compiladores como VS no pueden estar con MinGW, pero ¿pueden diferentes generaciones del mismo compilador? ¿Es probable que ocurran problemas? ¿Entonces qué?
Solo puede mezclar archivos binarios generados de diferentes compiladores o diferentes versiones del mismo compilador si son compatibles con ABI (Interfaz binaria de aplicaciones).
Cosas como:
- Procedimiento de llamada
- Nombre mangling
- Manejo de almacenamiento local de hilo
Son todos parte de la ABI.
Si una de estas cosas cambia, encontrará que obtiene errores del enlazador, bloqueos u otras formas de comportamiento inesperado. Como regla general, los proveedores de compiladores a menudo intentarán mantener al menos la compatibilidad con versiones anteriores, pero no hay garantía de ello. Como han dicho otros, debes leer la documentación o simplemente volver a compilar todo.