Usando diferentes compiladores de C ++ y versiones de idioma al desarrollar un solo ejecutable

15

Nuestra compañía comprará una pieza grande y muy compleja de código fuente para comunicaciones satelitales.

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

  • ¿Es necesario que utilicemos 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, _might_ queremos usar algunas de sus características, pero no si puede haber 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 generen diferentes códigos de objeto, lo que podría generar diferencias de tiempo, etc.

¿Qué debemos tener en cuenta?

    
pregunta Mawg 16.02.2017 - 16:26

6 respuestas

9
  

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

Depende.

Los compiladores generan código dirigido a una ABI. Algunos están usando un ABI común (por ejemplo, si no me equivoco, tanto clang ++ como g ++ target para el Itanium ABI llamado) y usted debería (puede haber errores que le impiden hacerlo) poder usar el código objeto de ambos en un mismo programa (suponiendo que, por supuesto, está utilizando versiones que apuntan a la misma versión de ABI). Lo mismo ocurre con la versión del compilador: algunos prestan más atención para mantener el mismo ABI entre las versiones que otros. Obviamente, todos necesitan un cambio ABI en algún momento, 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). Poder hacer que funcione puede depender de lo que se use en la interfaz.

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

    
respondido por el AProgrammer 16.02.2017 - 17:52
8
  

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

Esto 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 utilizarse 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 diferente.

Esto es especialmente importante cuando compra el componente o partes de él como fuente cerrada. Incluso si su proveedor le garantiza que puede usar el componente con su entorno de compilador actual, ¿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, es probable que no tenga mucha suerte al intentar resolver usted mismo los problemas de compatibilidad. Por eso no solo debe comprar el software, sino también pensar en un contrato de mantenimiento a largo plazo con su proveedor.

    
respondido por el Doc Brown 16.02.2017 - 19:43
4
  

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

¡Suena bien!

  

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

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 de 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, ya que los diferentes compiladores son buenos para 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 la implementación, o incluso de un comportamiento indefinido. Puede hacer suposiciones sobre los tipos incorporados o sobre el endianness de la plataforma. Incluso un software bien escrito puede no tener más remedio que confiar en extensiones no estándar que no están disponibles en su cadena de herramientas elegida, o puede hacerlo porque simplemente no hubo necesidad de dedicar tiempo a agregar una capa de portabilidad dentro de la duración de El proyecto original.

En última instancia, deberá preguntar al autor / proveedor para qué está escrito el código fuente. Si afirman que está escrito específicamente en contra, por ejemplo, Visual Studio 2015, y requiere características de la API de Windows, probablemente debería seguir 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 proveedor estaba mintiendo.

  

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

Probablemente. Tal vez.

C ++ 03 es compatible con versiones posteriores en su mayor parte, por lo que, si el código es C ++ 03, es poco probable que tenga un problema. (Aunque algunos ajustes pueden ser necesarios).

Pero las características introducidas en C ++ 11 y C ++ 14 no son compatibles con versiones anteriores, por lo que si el proveedor utiliza, por ejemplo, las lambdas de C ++ 11, e intenta compilar su código en un compilador de C ++ 03, eso simplemente no funcionará.

  

En teoría, por supuesto, no debería importar, especialmente la versión del idioma, pero es concebible que las diferentes versiones del compilador generen 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 es responsabilidad del proveedor ser responsable e informarle de ello. Como vivimos en el mundo real, recomiendo ser diligentes y preguntarles primero.

Y me haré eco de lo que otros han dicho: asegúrate de que tienes algún tipo de recurso de apoyo, de modo que si falsificaron alguna de las respuestas a estas preguntas (ya sea de manera intencional o de otro tipo) no acabes asumiendo el costo resultante .

    
respondido por el Lightness Races in Orbit 16.02.2017 - 21:56
2

No vinculas código, vinculas archivos de objetos compilados.

En este caso, sí, usar diferentes compiladores de C ++ (o incluso configuraciones como depuración / compilaciones de lanzamiento), o diferentes versiones de ellos, o diferentes (versiones de) bibliotecas estándar cuando se crean partes que interactuarán a nivel binario para romper la aplicación si las partes se comunican entre sí utilizando más de C API.

Las características como contenedores o 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 se dirige el código?
  • ¿Para qué estándar fue escrito?
  • ¿Utiliza características del compilador no estándar?
  • ¿El código contiene suposiciones específicas de la plataforma codificada (como siempre teniendo en cuenta que los punteros ocupan 2 bytes)?

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

    
respondido por el D. Jurcau 16.02.2017 - 16:57
1
  

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

Bueno, cambiar compilador, puede llevar a algunos problemas; actualmente en mi empresa, usamos 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, podríamos querer usar algunas de sus características, pero no si puede haber problemas al mezclar diferentes versiones.

No es necesario, pero, por supuesto, el compilador debe ser compatible con la versión de C ++ que desee utilizar. C ++ garantiza compatibilidad retro a partir de todas las versiones.

    
respondido por el LaboPie 16.02.2017 - 16:36
1

Un gran problema al cambiar los compiladores es el comportamiento indefinido: si el código que recibes 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 se equivoca terriblemente. tu compilador

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

    
respondido por el gnasher729 16.02.2017 - 18:58

Lea otras preguntas en las etiquetas