Notre entreprise achètera un morceau de code source volumineux et très complexe pour les communications par satellite.
Il est codé en C ++ et nous y coderons des ajouts, également en C ++, reliant notre code avec le code acheté en une seule unité exécutable.
Est-il nécessaire d'utiliser le même compilateur et la même version de compilateur que ceux utilisés pour développer le code acheté?
Faut-il utiliser la même version de C ++ que le code acheté? S'il n'utilise pas 2014, nous _pourrons_ vouloir en utiliser certaines fonctionnalités, mais pas s'il peut y avoir des problèmes avec le mélange de différentes versions.
En théorie, bien sûr, cela ne devrait pas avoir d'importance, en particulier la version du langage, mais il est concevable que différentes versions du compilateur génèrent un code objet différent, ce qui peut entraîner des différences de synchronisation, etc.
Que devons-nous savoir?
Réponses:
Ça dépend.
Les compilateurs génèrent du code ciblant un ABI. Certains utilisent un ABI commun (par exemple, si je ne me trompe pas, les cibles clang ++ et g ++ sont appelées Itanium ABI) et vous devriez - il peut y avoir des bogues vous en empêcher - utiliser le code objet des deux dans un même programme (en supposant bien sûr que vous utilisez des versions qui ciblent la même version de l'ABI). Il en va de même entre les versions du compilateur: certains font plus attention à conserver le même ABI entre les versions que les autres. De toute évidence, ils ont tous parfois besoin d'un changement ABI, et ils peuvent être forcés de le faire d'une manière non compatible. Et évidemment, certains paramètres comme le choix d'une norme de langue peuvent avoir une influence sur le choix de l'ABI.
Il y a ensuite le problème de la bibliothèque standard. Les compilateurs (ou différentes versions du même compilateur) eux-mêmes peuvent utiliser le même ABI, et pourtant leur bibliothèque standard peut être incompatible (et certains compilateurs comme clang ++ peuvent être utilisables avec plusieurs bibliothèques standard). Pouvoir le faire fonctionner peut dépendre de ce qui est utilisé dans l'interface.
En d'autres termes, vous devez creuser et trouver les informations pour le cas spécifique dans lequel vous vous trouvez. Comme point de départ et un exemple du type d'informations que vous devez rechercher, voici les informations fournies par libstdc ++ (la bibliothèque utilisée par g ++ et dans certaines configurations par clang ++)
la source
Ce n'est pas principalement une question technique. C'est une question juridique sur ce que vous écrivez dans votre contrat. Assurez-vous que le fournisseur de logiciels vous fournit une version garantie par lui pour être utilisable dans votre environnement. Sinon, il y aura toujours un certain risque de rencontrer des problèmes avec un compilateur, une version de compilateur ou une version de langue différents.
Ceci est particulièrement important lorsque vous achetez le composant ou des parties de celui-ci en tant que source fermée. Même si votre fournisseur garantit que vous pouvez utiliser le composant avec votre environnement de compilation actuel, garantit-il qu'il vous fournira des mises à jour si vous souhaitez passer à une version de compilation plus récente à l'avenir? Si vous n'avez pas accès au code source complet, vous n'aurez probablement pas beaucoup de chance pour essayer de résoudre vous-même les problèmes de compatibilité. C'est pourquoi vous ne devez pas simplement acheter le logiciel, mais aussi penser à un contrat de maintenance à long terme avec votre fournisseur.
la source
Ça m'a l'air bien!
De manière générale, non ce n'est pas nécessaire. Le but de C ++ est d'agir comme une abstraction sur ce genre de choses, donc un programme C ++ bien écrit compilera aussi bien sur votre chaîne d'outils que sur l'auteur d'origine, et le programme résultant aura le même résultat. Les performances peuvent varier, car différents compilateurs sont bons dans différentes choses, mais le comportement fondamental du programme ne doit pas changer.
Cependant, un logiciel mal écrit peut dépendre d'un comportement spécifique à l'implémentation, voire d'un comportement non défini. Il peut émettre des hypothèses sur les types intégrés ou sur l'endianité de la plate-forme. Même un logiciel bien écrit peut ne pas avoir d'autre choix que de s'appuyer sur des extensions non standard qui ne sont pas disponibles sur la chaîne d'outils que vous avez choisie, ou il peut le faire car il n'était tout simplement pas nécessaire de passer du temps à ajouter une couche de portabilité pendant la durée de le projet d'origine.
En fin de compte, vous devrez demander à l'auteur / au vendeur à quoi le code source est écrit. S'ils affirment qu'il est spécifiquement écrit contre, disons, Visual Studio 2015 et nécessite des fonctionnalités de l'API Windows, vous devriez probablement vous en tenir à cela. Mais s'ils prétendent qu'il est portable, C ++ standard, alors utilisez le compilateur que vous aimez. Assurez-vous que votre contrat d'achat comprend un accord de support afin que vous puissiez obtenir de l'aide gratuite lorsqu'il s'avère que le vendeur mentait.
Probablement. Peut être.
C ++ 03 est compatible avec la plupart du temps, donc si le code est C ++ 03, il est peu probable que vous ayez un problème. (Bien que certains ajustements puissent être nécessaires.)
Mais les fonctionnalités introduites dans C ++ 11 et C ++ 14 ne sont pas rétrocompatibles, donc si le fournisseur utilise, par exemple, C ++ 11 lambdas, et que vous essayez de construire leur code dans un compilateur C ++ 03, qui vient de gagner ça marche pas.
Absolument. Si le code s'appuie tellement sur une implémentation spécifique pour obtenir les résultats attendus, alors c'est au vendeur d'être responsable et de vous en informer. Puisque nous vivons dans le monde réel, je recommande d'être diligent et de leur demander d'abord.
Et je ferai écho à ce que les autres ont dit: assurez-vous que vous avez une sorte de recours de soutien, afin que s'ils dénaturent l'une des réponses à ces questions (que ce soit intentionnellement ou non), vous ne finissez pas par assumer le coût résultant.
la source
Vous ne liez pas de code, vous liez des fichiers d'objets compilés.
Dans ce cas, oui, l'utilisation de différents compilateurs C ++ (ou même de paramètres tels que les versions de débogage / version), ou différentes versions d'entre eux, ou différentes (versions de) bibliothèques standard lors de la création de parties qui interagiront au niveau binaire est très susceptible de briser le application si les pièces communiquent entre elles en utilisant plus de C API.
Des fonctionnalités telles que les conteneurs ou les exceptions fournissent la même interface mais, au niveau binaire, peuvent être implémentées de nombreuses manières différentes et incompatibles.
L'utilisation d'un compilateur différent pour compiler le code entier est cependant un problème différent. Questions à considérer:
Il existe également le risque que le code contienne des parties qui entraînent un comportement indéfini. Ceux-ci peuvent sembler fonctionner correctement lors de l'utilisation d'un compilateur mais échouer de manière mystérieuse lors de l'utilisation d'un autre.
la source
Eh bien, le changement de compilateur peut entraîner des problèmes; actuellement dans mon entreprise, nous utilisons Clang et MSVC, et nous avons une erreur dans un compilateur que l'autre ne marque pas comme tel.
Ce n'est pas nécessaire, mais bien sûr, votre compilateur doit prendre en charge la version C ++ que vous souhaitez utiliser. C ++ garantit une rétro compatibilité à partir de toutes les versions.
la source
Un gros problème lors du changement de compilateur est le comportement indéfini: si le code que vous recevez invoque un comportement indéfini, alors tout est possible - y compris que le code fonctionne très bien et passe tous ses tests lors de l'utilisation de son compilateur, et va terriblement mal avec votre compilateur.
C'est possible, mais dans cette situation, vous pouvez également rencontrer des problèmes si vous modifiez les niveaux d'optimisation, utilisez la prochaine version du même compilateur, etc. Vous ne pouvez donc rien éviter.
la source