Usar diferentes compiladores de C ++ y versiones de lenguaje al desarrollar un solo ejecutable

15

Nuestra compañía comprará un código fuente grande y muy complejo para comunicaciones satelitales.

Está codificado en C ++ y codificaremos adiciones a él, también en C ++, vinculando nuestro código con el código comprado en una sola unidad ejecutable.

  • ¿Es necesario que usemos el mismo compilador y la misma versión del compilador que se utilizó para desarrollar el código comprado?

  • ¿Es necesario que usemos la misma versión de C ++ que el código comprado? Si no está usando 2014, es posible que deseemos usar algunas características, pero no si puede haber algunos problemas al mezclar diferentes versiones.

En teoría, por supuesto, no debería importar, especialmente la versión del idioma, pero es concebible que las diferentes versiones del compilador generarán diferentes códigos de objeto, lo que podría generar diferencias de tiempo, etc.

¿De qué debemos ser conscientes?

Mawg dice que reinstalar a Mónica
fuente
77
Espero que no solo esté comprando el código fuente, sino también algún soporte (por parte de personas calificadas).
Basile Starynkevitch
1
De hecho, lo somos. Y, por supuesto, también he hecho esta pregunta al proveedor. Pero pensé que sería un buen punto de discusión aquí, y una buena referencia futura para otros en el futuro.
Mawg dice que reinstalar a Monica
2
¿Está hablando de compilar el código de terceros utilizando un compilador no compatible, o está hablando de compilar diferentes partes del código utilizando diferentes compiladores (por ejemplo, usar el compatible para el código que está comprando y uno más nuevo para su propio código y luego vincularlos)? ¿O es decidir entre esas partes de la pregunta?
jpmc26
33
Incluso la versión de idioma puede ser importante, consulte gcc.gnu.org/wiki/Cxx11AbiCompatibility para obtener una lista de las versiones del compilador (anteriores) y pequeñas diferencias en el ABI. En otras palabras: el mismo compilador, pero diferente configuración del lenguaje c ++ (c ++ 03 s c ++ 11) puede ser importante.
André
2
Y con MSVC, en general no es seguro pasar objetos de biblioteca estándar a través de límites de biblioteca (dinámicos). Ver por ejemplo stackoverflow.com/q/5661738/417197
André

Respuestas:

9

¿Es necesario que usemos el mismo compilador y la misma versión del compilador que se utilizó para desarrollar el código comprado?

Depende.

Los compiladores generan código dirigido a un ABI. Algunos están usando un ABI común (por ejemplo, si no me equivoco, tanto el clang ++ como el g ++ se dirigen a Itanium ABI) y usted debe, puede haber errores que lo impidan, poder usar el código objeto de ambos en un mismo programa (suponiendo, por supuesto, que está utilizando versiones que se dirigen a la misma versión del ABI). Lo mismo ocurre con la versión del compilador: algunos prestan más atención para mantener el mismo ABI entre versiones que otros. Obviamente, todos necesitan en algún momento un cambio de ABI, y pueden verse obligados a hacerlo de una manera no compatible. Y, obviamente, algunas configuraciones como la elección de un estándar de idioma pueden influir en la elección del ABI.

Luego está el problema de la biblioteca estándar. Los compiladores (o diferentes versiones del mismo compilador) pueden usar el mismo ABI y, sin embargo, su biblioteca estándar puede ser incompatible (y algunos compiladores como clang ++ pueden usarse con varias bibliotecas estándar). Ser capaz de hacerlo funcionar puede depender de lo que se use en la interfaz.

En otras palabras, debe cavar y encontrar la información para el caso específico en el que se encuentra. Como punto de partida y un ejemplo de qué tipo de información debe buscar, aquí está la información proporcionada por libstdc ++ (la biblioteca utilizada por g ++ y en alguna configuración por clang ++)

Un programador
fuente
10
ABI = Interfaz binaria de aplicación
Simon B
2
Esta respuesta es sobre la compatibilidad del código objeto. OP está comprando el código fuente .
Lightness compite con Monica
77
@LightnessRacesinOrbit La pregunta habla sobre el uso de diferentes compiladores para generar un solo ejecutable. No es un gran salto pensar: "Significan compilar el código de un tercero con un compilador (probablemente uno 'compatible') y su propio código con un compilador diferente (probablemente uno más nuevo)". (Esto es definitivamente lo que entiendo que está preguntando el OP; si lo lee de manera diferente, puede pedirle al OP que aclare). En esa posibilidad u otras similares, la compatibilidad del código objeto parece muy relevante.
jpmc26
1
@ jpmc26: "Definitivamente, esto es lo que entiendo que está preguntando el OP; si lo lees de manera diferente, quizás quieras pedirle al OP que lo aclare". OP declaró claramente que su compañía "comprará un código fuente grande y muy complejo". Además, con declaraciones como "es concebible que las diferentes versiones del compilador generarán diferentes códigos de objeto, lo que podría generar diferencias de tiempo", se preguntan qué cambios cuando compilan el código comprado con diferentes cadenas de herramientas, no solo las suyas. ¡No creo que haya mucho espacio para la interpretación allí!
Lightness compite con Monica
8

¿Es necesario que usemos el mismo compilador y la misma versión del compilador que se utilizó para desarrollar el código comprado? ¿Es necesario que usemos la misma versión de C ++ que el código comprado?

Esta no es principalmente una cuestión técnica. Es una pregunta legal sobre lo que escribe en su contrato. Asegúrese de que el proveedor de software le proporcione una versión garantizada por él para que pueda utilizarla en su entorno. De lo contrario, siempre habrá un cierto riesgo de tener problemas con un compilador, una versión de compilador o una versión de idioma diferentes.

Esto es especialmente importante cuando compra el componente o partes del mismo como fuente cerrada. Incluso si su proveedor le garantiza que puede usar el componente con su entorno de compilador actual, ¿le garantiza que le proporcionará actualizaciones si desea cambiar a una versión de compilador más nueva en el futuro? Si no tiene acceso al código fuente completo, probablemente no tendrá mucha suerte al tratar de resolver cualquier problema de compatibilidad por sí mismo. Es por eso que no solo debe comprar el software, sino también pensar en un contrato de mantenimiento a largo plazo con su proveedor.

Doc Brown
fuente
Este es realmente un buen consejo!
T. Sar - Restablece a Monica
De hecho, es, pero, por desgracia, demasiado tarde. Como le comenté al comentario de Basile, también le hice esta pregunta al proveedor. Pero pensé que sería un buen punto de discusión aquí, y una buena referencia futura para otros en el futuro
Mawg dice que reinstalará a Monica
4

Nuestra compañía comprará un código fuente grande y muy complejo para comunicaciones satelitales. Está codificado en C ++ y codificaremos adiciones a él, también en C ++, vinculando nuestro código con el código comprado en una sola unidad ejecutable.

¡Suena bien!

¿Es necesario que usemos el mismo compilador y la misma versión del compilador que se utilizó para desarrollar el código comprado?

Hablando en general, no, no es necesario. El propósito de C ++ es actuar como una abstracción sobre este tipo de cosas, por lo que un programa C ++ bien escrito se compilará tan bien en su cadena de herramientas como lo hizo en el autor original, y el programa resultante tendrá el mismo resultado. El rendimiento puede variar, porque diferentes compiladores son buenos en diferentes cosas, pero el comportamiento fundamental del programa no debe cambiar.

Sin embargo, el software mal escrito puede depender de un comportamiento específico de implementación, o incluso un comportamiento indefinido. Puede hacer suposiciones sobre los tipos incorporados, o sobre la resistencia de la plataforma. Incluso el software bien escrito puede no tener más remedio que confiar en extensiones no estándar que no están disponibles en la cadena de herramientas elegida, o puede hacerlo porque simplemente no había necesidad de pasar tiempo agregando una capa de portabilidad dentro de la duración de El proyecto original.

En última instancia, deberá preguntarle al autor / proveedor para qué está escrito el código fuente. Si afirman que está específicamente escrito en contra de, por ejemplo, Visual Studio 2015, y requiere características de la API de Windows, probablemente debería quedarse con eso. Pero si afirman que es portátil, C ++ estándar, utilice el compilador que desee. Asegúrese de que su acuerdo de compra incluya un acuerdo de soporte para que pueda obtener ayuda gratuita cuando resulte que el vendedor estaba mintiendo.

¿Es necesario que usemos la misma versión de C ++ que el código comprado? Si no está usando 2014, es posible que deseemos usar algunas características, pero no si puede haber algunos problemas al mezclar diferentes versiones.

Probablemente. Tal vez.

C ++ 03 es compatible con la mayoría de las versiones, por lo tanto, si el código es C ++ 03, es poco probable que tenga un problema. (Aunque pueden ser necesarios algunos ajustes).

Pero las características introducidas en C ++ 11 y C ++ 14 no son compatibles con versiones anteriores, por lo que si el proveedor usó, por ejemplo, C ++ 11 lambdas, e intenta construir su código en un compilador C ++ 03, eso acaba de ganar No funciona

En teoría, por supuesto, no debería importar, especialmente la versión del idioma, pero es concebible que las diferentes versiones del compilador generarán diferentes códigos de objeto, lo que podría generar diferencias de tiempo, etc.

Absolutamente. Si el código se basa tanto en una implementación específica para obtener los resultados esperados, entonces depende del vendedor ser responsable e informarle al respecto. Como vivimos en el mundo real, recomiendo ser diligente y preguntarles primero.

Y haré eco de lo que otros han dicho: asegúrese de tener algún tipo de recurso de apoyo, de modo que si tergiversan alguna de las respuestas a estas preguntas (ya sea intencionalmente o no) no termine asumiendo el costo resultante.

La ligereza corre con Mónica
fuente
Vale la pena señalar: el enlace no está completamente cubierto en las especificaciones de C ++. Si bien el código puede compilarse en múltiples compiladores conformes, no está garantizado que pueda vincularlos y hacer que funcione.
Cort Ammon - Restablece a Monica
1
@CortAmmon: debe / debe compilar todos los componentes de la distribución resultante con cadenas de herramientas que comparten una ABI. Los estándares ABI están fuera del alcance de C ++. No creo que el OP esté preguntando sobre la mezcla de cadenas de herramientas de todos modos.
Lightness compite con Monica
2

No vincula el código, vincula los archivos de objetos compilados.

En este caso, sí, el uso de diferentes compiladores de C ++ (o incluso configuraciones como compilaciones de depuración / lanzamiento), o diferentes versiones de ellos, o diferentes (versiones de) bibliotecas estándar al construir partes que interactuarán a nivel binario es muy probable que rompa el aplicación si las partes se comunican entre sí utilizando más de C API.

Las características como los contenedores o las excepciones proporcionan la misma interfaz pero, a nivel binario, se pueden implementar de muchas maneras diferentes e incompatibles.

Sin embargo, usar un compilador diferente para compilar todo el código es un problema diferente. Preguntas a considerar:

  • ¿A qué plataforma / arquitectura apunta el código?
  • ¿Para qué estándar fue escrito?
  • ¿Utiliza alguna función de compilador no estándar?
  • ¿El código contiene supuestos específicos de plataforma codificados (como siempre teniendo en cuenta que los punteros ocupan 2 bytes)?

También existe el riesgo de que el código pueda contener partes que provoquen un comportamiento indefinido. Puede parecer que funcionan bien cuando se usa un compilador, pero fallan de manera misteriosa cuando se usa uno diferente.

D. Jurcau
fuente
OP está construyendo el código, no el vendedor. OP pregunta cómo el cambio en el entorno de compilación (cf. del proveedor) puede afectar la generación de código dada la misma base de código.
Lightness compite con Monica
1

¿Es necesario que usemos el mismo compilador y la misma versión del compilador que se utilizó para desarrollar el código comprado?

Bueno, cambiar de compilador puede provocar algunos problemas; Actualmente en mi empresa, utilizamos Clang y MSVC, y tenemos un error en un compilador que el otro no marca como tal.

¿Es necesario que usemos la misma versión de C ++ que el código comprado? Si no está usando 2014, es posible que deseemos usar algunas características, pero no si puede haber algunos problemas al mezclar diferentes versiones.

No es necesario, pero, por supuesto, su compilador debe admitir la versión de C ++ que desea utilizar. C ++ garantiza la compatibilidad retro a partir de todas las versiones.

LaboPie
fuente
Más o menos mi pensamiento. ¿Qué pasa con las versiones del compilador, si usan GCC versión x y la última es x + 2, por ejemplo?
Mawg dice que reinstalar a Monica
1
Bueno, si usan una versión anterior del compilador que desea usar, no hay problema, ya que no existen cosas obsoletas, el problema podría surgir si estuvieran usando una versión más nueva de su compilador.
LaboPie
¿Pero cómo? Yo también preferiría no hacerlo. Pero, ¿conoce algún tipo de problema que pueda ocurrir?
Mawg dice que reinstalar a Monica
Pero, ¿conoce algún tipo de problema que pueda ocurrir? Si estaban utilizando alguna función que nuestro compilador no admitirá, el código simplemente no se compilará.
LaboPie
1
Un pequeño apéndice, por supuesto, el problema se agrava si el compilador utilizado desde la otra oficina no es importante. Por ejemplo, un viejo compilador de consola, o algo que funcione con un subconjunto de lenguaje.
LaboPie
1

Un gran problema al cambiar los compiladores es el comportamiento indefinido: si el código que recibe invoca un comportamiento indefinido, entonces todo es posible, incluido que el código funciona bien y pasa todas sus pruebas cuando usa su compilador, y su compilador se equivoca terriblemente.

Eso es posible, pero en esa situación también podría tener problemas si cambia los niveles de optimización, usa la próxima versión del mismo compilador y así sucesivamente. Entonces, nada que puedas evitar.

gnasher729
fuente
Este es un buen argumento para usar pelusa y tal vez valgrind .