Utilisation de différents compilateurs C ++ et versions de langage lors du développement d'un seul exécutable

15

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?

Mawg dit réintégrer Monica
la source
7
J'espère que non seulement vous achetez le code source, mais aussi du soutien (par des personnes qualifiées).
Basile Starynkevitch
1
En effet, nous le sommes. Et, bien sûr, j'ai aussi posé cette question au fournisseur. Mais je pensais que ce serait un bon point de discussion ici, et une bonne référence future pour les autres à l'avenir.
Mawg dit réintégrer Monica le
2
Parlez-vous de la compilation du code tiers à l'aide d'un compilateur non pris en charge, ou parlez-vous de la compilation de différentes parties de code à l'aide de différents compilateurs (par exemple, en utilisant celle prise en charge pour le code que vous achetez et une plus récente pour votre propre code, puis les reliant)? Ou décide-t-on entre ces parties de la question?
jpmc26
3
Même la version linguistique peut être importante, voir gcc.gnu.org/wiki/Cxx11AbiCompatibility pour une liste des versions de compilateur (plus anciennes) et de minuscules différences dans l'ABI. En d'autres termes: le même compilateur, mais des paramètres de langage c ++ différents (c ++ 03 s c ++ 11) peuvent avoir de l'importance.
André
2
Et avec MSVC, il n'est généralement pas sûr de faire passer des objets de bibliothèque standard à travers les limites (dynamiques) de la bibliothèque. Voir par exemple stackoverflow.com/q/5661738/417197
André

Réponses:

9

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é?

Ç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 ++)

AProgrammer
la source
10
ABI = Application Binary Interface
Simon B
2
Cette réponse concerne la compatibilité du code objet. OP achète du code source .
Courses de légèreté avec Monica
7
@LightnessRacesinOrbit La question parle de l'utilisation de différents compilateurs pour générer un seul exécutable. Ce n'est pas un grand pas en avant de penser: «Ils signifient la compilation du code tiers avec un compilateur (probablement un« pris en charge ») et leur propre code avec un compilateur différent (probablement un plus récent). (C'est certainement ce que je comprends que l'OP demande; si vous le lisez différemment, vous voudrez peut-être demander à l'OP de clarifier.) Dans cette possibilité ou dans d'autres similaires, la compatibilité du code objet semble très pertinente.
jpmc26
1
@ jpmc26: "C'est certainement ce que je comprends que l'OP demande; si vous le lisez différemment, vous voudrez peut-être demander à l'OP de clarifier." OP a clairement déclaré que son entreprise "achètera un morceau de code source volumineux et très complexe". En outre, avec des déclarations telles que "il est concevable que différentes versions du compilateur génèrent un code objet différent, ce qui pourrait entraîner des différences de synchronisation", ils demandent quels sont les changements lorsqu'ils compilent le code acheté avec différentes chaînes d'outils, pas seulement les leurs. Je ne pense pas qu'il y ait beaucoup de place pour l'interprétation ici!
Courses de légèreté avec Monica le
8

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é?

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.

Doc Brown
la source
C'est en fait un très bon conseil!
T. Sar - Rétablir Monica
Il est en effet, mais, hélas, trop tard. Comme je l'ai fait remarquer au commentaire de Basile, j'ai également posé cette question au fournisseur. Mais je pensais que ce serait un bon point de discussion ici, et une bonne référence future pour les autres à l'avenir
Mawg dit de réintégrer Monica le
4

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.

Ça m'a l'air bien!

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é?

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.

Faut-il utiliser la même version de C ++ que le code acheté? S'il n'utilise pas 2014, nous pourrions vouloir en utiliser certaines fonctionnalités, mais pas s'il peut y avoir des problèmes avec le mélange de différentes versions.

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.

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.

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.

Courses de légèreté avec Monica
la source
À noter: la liaison n'est pas entièrement couverte dans les spécifications C ++. Bien que le code puisse compiler dans plusieurs compilateurs conformes, il n'est pas garanti que vous puissiez simplement les lier ensemble et le faire fonctionner.
Cort Ammon - Rétablir Monica le
1
@CortAmmon: Vous devez / devez compiler tous les composants de la distribution résultante avec des chaînes d'outils qui partagent un ABI. Les normes ABI sont hors de portée de C ++. Je ne pense pas que l'OP demande de toute façon de mélanger les chaînes d'outils.
Courses de légèreté avec Monica le
2

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:

  • Quelle plateforme / architecture le code cible-t-il?
  • Pour quelle norme a-t-il été rédigé?
  • Utilise-t-il des fonctionnalités de compilation non standard?
  • Le code contient-il des hypothèses spécifiques à la plate-forme codées en dur (comme toujours en considérant que les pointeurs occupent 2 octets)?

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.

D. Jurcau
la source
OP construit le code, pas le vendeur. OP demande comment la modification de l'environnement de construction (cf. le fournisseur) peut affecter la génération de code étant donné la même base de code.
Courses de légèreté avec Monica le
1

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é?

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.

Faut-il utiliser la même version de C ++ que le code acheté? S'il n'utilise pas 2014, nous pourrions vouloir en utiliser certaines fonctionnalités, mais pas s'il peut y avoir des problèmes avec le mélange de différentes versions.

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.

LaboPie
la source
À peu près ma pensée. Qu'en est-il des versions du compilateur - si elles utilisent la version x de GCC et la dernière est x + 2, par exemple?
Mawg dit réintégrer Monica le
1
Eh bien, s'ils utilisent une ancienne version du compilateur que vous souhaitez utiliser, il n'y a pas de problème, car il n'y a pas de choses obsolètes, le problème pourrait se poser s'ils utilisaient une version plus récente de votre compilateur.
LaboPie
Mais comment? Moi aussi, je préfère ne pas le faire. Mais connaissez-vous un type de problème qui pourrait survenir?
Mawg dit réintégrer Monica le
Mais connaissez-vous un type de problème qui pourrait survenir? S'ils utilisaient une fonction que notre compilateur ne prend pas en charge, le code ne sera tout simplement pas compilé.
LaboPie
1
Un petit appendice, bien sûr, le problème devient plus important si le compilateur utilisé depuis l'autre bureau n'est pas majeur. EG un ancien compilateur de console, ou quelque chose qui fonctionne avec un sous-ensemble de langage.
LaboPie
1

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.

gnasher729
la source
C'est un bon argument pour utiliser de la charpie et peut-être du valgrind .