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?
Respuestas:
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 ++)
fuente
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.
fuente
¡Suena bien!
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.
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
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.
fuente
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:
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.
fuente
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.
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.
fuente
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.
fuente