Verwendung verschiedener C ++ - Compiler und Sprachversionen bei der Entwicklung einer einzelnen ausführbaren Datei

15

Unser Unternehmen wird einen großen und sehr komplexen Quellcode für die Satellitenkommunikation erwerben.

Es ist in C ++ codiert, und wir werden Ergänzungen dazu codieren, auch in C ++, und unseren Code mit dem gekauften Code in einer einzigen ausführbaren Einheit verknüpfen.

  • Ist es notwendig, dass wir denselben Compiler und dieselbe Compilerversion verwenden, mit denen der gekaufte Code entwickelt wurde?

  • Ist es notwendig, dass wir dieselbe Version von C ++ wie den gekauften Code verwenden? Wenn 2014 nicht verwendet wird, möchten wir möglicherweise einige Funktionen verwenden, aber nicht, wenn beim Mischen verschiedener Versionen Probleme auftreten können.

Theoretisch sollte es natürlich keine Rolle spielen, insbesondere die Sprachversion, aber es ist denkbar, dass verschiedene Versionen des Compilers unterschiedlichen Objektcode generieren, was möglicherweise zu Zeitunterschieden usw. führt.

Was sollten wir beachten?

Laut Mawg soll Monica wieder eingesetzt werden
quelle
7
Ich hoffe, Sie kaufen nicht nur den Quellcode, sondern unterstützen ihn auch (von qualifizierten Personen).
Basile Starynkevitch
1
In der Tat sind wir. Und diese Frage habe ich natürlich auch dem Lieferanten gestellt. Aber ich dachte, dass dies hier ein guter Diskussionspunkt und eine gute zukünftige Referenz für andere sein würde.
Mawg sagt, Monica
2
Sprechen Sie über das Kompilieren des Drittanbieter-Codes mit einem nicht unterstützten Compiler oder über das Kompilieren verschiedener Teile des Codes mit verschiedenen Compilern (z. B. mit dem unterstützten für den von Ihnen gekauften Code und einem neueren für Ihren eigenen Code und dann sie verlinken)? Oder entscheidet sich zwischen diesen Teilen der Frage?
jpmc26
3
Sogar die Sprachversion kann von Bedeutung sein. Eine Liste der (älteren) Compilerversionen und winzigen Unterschiede im ABI finden Sie unter gcc.gnu.org/wiki/Cxx11AbiCompatibility . Mit anderen Worten: Der gleiche Compiler, aber eine andere C ++ - Spracheinstellung (C ++ 03 s C ++ 11) kann von Bedeutung sein.
André
2
Und mit MSVC ist es im Allgemeinen nicht sicher, Standardbibliotheksobjekte über (dynamische) Bibliotheksgrenzen hinweg weiterzugeben. Siehe zum Beispiel stackoverflow.com/q/5661738/417197
André

Antworten:

9

Ist es notwendig, dass wir denselben Compiler und dieselbe Compilerversion verwenden, mit denen der gekaufte Code entwickelt wurde?

Es hängt davon ab, ob.

Compiler generieren Code für ein ABI. Einige verwenden ein gemeinsames ABI (wenn ich mich nicht irre, haben sowohl clang ++ als auch g ++ das Ziel Itanium ABI genannt) und Sie sollten - möglicherweise gibt es Fehler, die Sie daran hindern - in der Lage sein, den Objektcode zu verwenden von beiden in einem gleichen Programm (vorausgesetzt natürlich, Sie verwenden Versionen, die auf dieselbe Version des ABI abzielen). Das Gleiche gilt für die Compiler-Version: Einige achten mehr darauf, dass die ABI zwischen den Versionen gleich bleibt als andere. Offensichtlich benötigen sie alle irgendwann eine ABI-Änderung, und sie können gezwungen sein, dies auf nicht kompatible Weise zu tun. Und natürlich können einige Einstellungen wie die Wahl eines Sprachstandards einen Einfluss auf die Wahl des ABI haben.

Dann gibt es die Ausgabe der Standardbibliothek. Die Compiler (oder verschiedene Versionen desselben Compilers) selbst verwenden möglicherweise dasselbe ABI, und dennoch ist ihre Standardbibliothek möglicherweise nicht kompatibel (und einige Compiler wie clang ++ können möglicherweise mit mehreren Standardbibliotheken verwendet werden). Die Funktionsfähigkeit kann davon abhängen, was in der Benutzeroberfläche verwendet wird.

Mit anderen Worten, Sie müssen nach Informationen für den speziellen Fall suchen, in dem Sie sich befinden. Als Ausgangspunkt und als Beispiel für die Art von Informationen, nach denen Sie suchen sollten, finden Sie hier die Informationen, die von libstdc ++ (der von g ++ verwendeten Bibliothek) bereitgestellt werden und in einigen Konfigurationen von clang ++)

Ein Programmierer
quelle
10
ABI = Application Binary Interface
Simon B
2
Diese Antwort handelt von der Kompatibilität des Objektcodes. OP kauft Quellcode .
Leichtigkeit Rennen mit Monica
7
@LightnessRacesinOrbit In dieser Frage geht es um die Verwendung verschiedener Compiler zum Generieren einer einzelnen ausführbaren Datei. Es ist kein großer Sprung zu denken: "Sie bedeuten, den Code eines Drittanbieters mit einem Compiler (wahrscheinlich einem 'unterstützten') und ihren eigenen Code mit einem anderen Compiler (wahrscheinlich einem neueren) zu kompilieren." (Dies ist definitiv das, was ich unter dem OP verstehe. Wenn Sie es anders lesen, können Sie das OP bitten, dies zu klären.) Bei dieser oder ähnlichen Möglichkeiten scheint die Kompatibilität des Objektcodes von hoher Relevanz zu sein.
jpmc26
1
@ jpmc26: "Dies ist definitiv das, was ich unter OP verstehe. Wenn Sie es anders lesen, können Sie das OP bitten, dies zu klären." OP erklärte klar, dass sein Unternehmen "ein großes und sehr komplexes Stück Quellcode kaufen wird". Mit Aussagen wie "Es ist denkbar, dass verschiedene Versionen des Compilers unterschiedliche Objektcodes generieren, was möglicherweise zu Zeitunterschieden führt" werden sie außerdem gefragt, welche Änderungen sie vornehmen, wenn sie den gekauften Code nicht nur mit ihren eigenen, sondern mit verschiedenen Toolchains kompilieren. Ich glaube nicht, dass es dort viel Raum für Interpretationen gibt!
Leichtigkeit Rennen mit Monica
8

Ist es notwendig, dass wir denselben Compiler und dieselbe Compilerversion verwenden, mit denen der gekaufte Code entwickelt wurde? Ist es notwendig, dass wir dieselbe Version von C ++ wie den gekauften Code verwenden?

Dies ist nicht hauptsächlich eine technische Frage. Es ist eine rechtliche Frage, was Sie in Ihrem Vertrag schreiben. Stellen Sie sicher, dass der Softwarehersteller Ihnen eine von ihm garantierte Version zur Verfügung stellt, die in Ihrer Umgebung verwendet werden kann. Andernfalls besteht immer das Risiko, dass Probleme mit einem anderen Compiler, einer anderen Compilerversion oder einer anderen Sprachversion auftreten.

Dies ist besonders wichtig, wenn Sie die Komponente oder Teile davon als geschlossene Quelle erwerben. Auch wenn Ihr Lieferant garantiert, dass Sie die Komponente in Ihrer aktuellen Compiler-Umgebung verwenden können, kann er Ihnen dann Aktualisierungen bereitstellen, wenn Sie in Zukunft auf eine neuere Compiler-Version wechseln möchten? Wenn Sie nicht auf den vollständigen Quellcode zugreifen können, werden Sie wahrscheinlich nicht viel Glück haben, Kompatibilitätsprobleme selbst zu lösen. Deshalb sollten Sie nicht nur die Software kaufen, sondern auch über einen langfristigen Wartungsvertrag mit Ihrem Lieferanten nachdenken.

Doc Brown
quelle
Das ist eigentlich ein ziemlich guter Rat!
T. Sar - Reinstate Monica
Es ist zwar, aber leider zu spät. Wie ich zu Basiles Kommentar bemerkte, habe ich diese Frage auch dem Lieferanten gestellt. Aber ich dachte, dass es ein guter Diskussionspunkt und eine gute zukünftige Referenz für andere in Zukunft sein würde
Mawg sagt, Monica
4

Unser Unternehmen wird einen großen und sehr komplexen Quellcode für die Satellitenkommunikation erwerben. Es ist in C ++ codiert, und wir werden Ergänzungen dazu codieren, auch in C ++, und unseren Code mit dem gekauften Code in einer einzigen ausführbaren Einheit verknüpfen.

Hört sich gut an!

Ist es notwendig, dass wir denselben Compiler und dieselbe Compilerversion verwenden, mit denen der gekaufte Code entwickelt wurde?

Generell gesagt, nein, es ist nicht notwendig. Der Zweck von C ++ ist es, diese Art von Dingen zu abstrahieren, sodass ein gut geschriebenes C ++ - Programm auf Ihrer Toolchain genauso gut kompiliert wird wie auf der des ursprünglichen Autors, und das resultierende Programm wird dasselbe Ergebnis haben. Die Leistung kann variieren, weil verschiedene Compiler in verschiedenen Dingen gut sind, aber das grundlegende Verhalten des Programms sollte sich nicht ändern.

Schlecht geschriebene Software kann sich jedoch auf implementierungsspezifisches oder sogar undefiniertes Verhalten stützen. Es kann Annahmen über die eingebauten Typen oder über die Endianität der Plattform treffen. Sogar gut geschriebene Software hat möglicherweise keine andere Wahl, als sich auf nicht standardmäßige Erweiterungen zu verlassen, die für die von Ihnen ausgewählte Toolchain nicht verfügbar sind, oder es war einfach nicht erforderlich, Zeit für das Hinzufügen einer Portabilitätsschicht innerhalb von zu investieren das ursprüngliche Projekt.

Letztendlich müssen Sie den Autor / Anbieter fragen, wofür der Quellcode geschrieben wurde. Wenn sie behaupten, dass es speziell für Visual Studio 2015 geschrieben wurde und Windows-API-Funktionen erfordert, sollten Sie sich wahrscheinlich daran halten. Wenn sie jedoch behaupten, dass es portabel ist, verwenden Sie einen beliebigen Compiler. Stellen Sie sicher, dass Ihr Kaufvertrag eine Support-Vereinbarung enthält, damit Sie kostenlose Hilfe erhalten, wenn sich herausstellt, dass der Verkäufer lügt.

Ist es notwendig, dass wir dieselbe Version von C ++ wie den gekauften Code verwenden? Wenn 2014 nicht verwendet wird, möchten wir möglicherweise einige Funktionen verwenden, aber nicht, wenn beim Mischen verschiedener Versionen Probleme auftreten können.

Wahrscheinlich. Könnte sein.

C ++ 03 ist zum größten Teil vorwärtskompatibel. Wenn der Code C ++ 03 ist, ist es unwahrscheinlich, dass Sie ein Problem haben. (Obwohl einige Optimierungen erforderlich sein können.)

In C ++ 11 und C ++ 14 eingeführte Funktionen sind jedoch nicht abwärtskompatibel. Wenn also der Hersteller beispielsweise C ++ 11-Lambdas verwendet und Sie versuchen, ihren Code in einem C ++ 03-Compiler zu erstellen, der gerade gewonnen hat funktioniert nicht.

Theoretisch sollte es natürlich keine Rolle spielen, insbesondere die Sprachversion, aber es ist denkbar, dass verschiedene Versionen des Compilers unterschiedlichen Objektcode generieren, was möglicherweise zu Zeitunterschieden usw. führt.

Absolut. Wenn der Code so stark von einer bestimmten Implementierung abhängt, um die erwarteten Ergebnisse zu erzielen, ist es Sache des Anbieters, dafür verantwortlich zu sein und Sie darüber zu informieren. Da wir in der realen Welt leben, empfehle ich fleißig zu sein und sie zuerst zu fragen.

Und ich werde wiederholen, was andere gesagt haben: Stellen Sie sicher, dass Sie eine Art Rückgriff auf Unterstützung haben, damit Sie die daraus resultierenden Kosten nicht tragen, wenn sie eine der Antworten auf diese Fragen (absichtlich oder auf andere Weise) falsch darstellen.

Leichtigkeit Rennen mit Monica
quelle
Bemerkenswert: Die Verknüpfung wird in den C ++ - Spezifikationen nicht vollständig behandelt. Obwohl der Code möglicherweise in mehreren kompatiblen Compilern kompiliert wird, kann nicht garantiert werden, dass Sie sie einfach miteinander verknüpfen und funktionsfähig machen können.
Cort Ammon - Reinstate Monica
1
@CortAmmon: Sie sollten / müssen alle Komponenten der resultierenden Distribution mit Toolchains kompilieren, die ein ABI gemeinsam haben. ABI-Standards fallen nicht in den Anwendungsbereich von C ++. Ich glaube, das OP fragt sowieso nicht nach dem Mischen von Werkzeugketten.
Leichtigkeit Rennen mit Monica
2

Sie verknüpfen keinen Code, Sie verknüpfen kompilierte Objektdateien.

In diesem Fall ist es sehr wahrscheinlich, dass die Verwendung verschiedener C ++ - Compiler (oder sogar von Einstellungen wie Debug- / Release-Builds) oder verschiedener Versionen davon oder verschiedener (Versionen von) Standardbibliotheken, wenn Teile erstellt werden, die auf Binärebene interagieren, den Fehler verursacht Anwendung, wenn die Teile über mehr als C-APIs miteinander kommunizieren.

Features wie Container oder Ausnahmen bieten die gleiche Schnittstelle, können jedoch auf binärer Ebene auf viele verschiedene, inkompatible Arten implementiert werden.

Die Verwendung eines anderen Compilers zum Kompilieren des gesamten Codes ist jedoch ein anderes Problem. Zu berücksichtigende Fragen:

  • Auf welche Plattform / Architektur zielt der Code ab?
  • Für welchen Standard wurde es geschrieben?
  • Verwendet es nicht standardmäßige Compiler-Funktionen?
  • Enthält der Code fest codierte plattformspezifische Annahmen (wie immer, wenn man bedenkt, dass Zeiger 2 Bytes belegen)?

Es besteht auch das Risiko, dass Code Teile enthält, die zu undefiniertem Verhalten führen. Diese funktionieren möglicherweise einwandfrei, wenn ein Compiler verwendet wird, schlagen jedoch auf mysteriöse Weise fehl, wenn ein anderer verwendet wird.

D. Jurcau
quelle
OP erstellt den Code, nicht den Hersteller. OP fragt, wie sich das Ändern der Build-Umgebung (siehe Hersteller) bei gleicher Codebasis auf die Codegenerierung auswirken kann.
Leichtigkeit Rennen mit Monica
1

Ist es notwendig, dass wir denselben Compiler und dieselbe Compilerversion verwenden, mit denen der gekaufte Code entwickelt wurde?

Das Wechseln des Compilers kann zu Problemen führen. Derzeit arbeiten wir in meiner Firma mit Clang und MSVC. In einem Compiler ist ein Fehler aufgetreten, den der andere nicht als solchen markiert.

Ist es notwendig, dass wir dieselbe Version von C ++ wie den gekauften Code verwenden? Wenn 2014 nicht verwendet wird, möchten wir möglicherweise einige Funktionen verwenden, aber nicht, wenn beim Mischen verschiedener Versionen Probleme auftreten können.

Es ist nicht notwendig, aber natürlich sollte Ihr Compiler die C ++ - Version unterstützen, die Sie verwenden möchten. C ++ garantiert Retro-Kompatibilität ab allen Versionen.

LaboPie
quelle
So ziemlich mein Denken. Was ist mit Compiler-Versionen - wenn sie beispielsweise die GCC-Version x und die neueste Version x + 2 verwenden?
Mawg sagt, Monica
1
Nun, wenn sie eine ältere Version des Compilers verwenden, die Sie verwenden möchten, gibt es kein Problem, da es keine veralteten Inhalte gibt. Das Problem könnte auftreten, wenn sie eine neuere Version Ihres Compilers verwenden.
LaboPie
Aber wie? Auch ich würde es vorziehen, das nicht zu tun. Aber sind Sie sich irgendeines Problems bewusst, das auftreten könnte?
Mawg sagt, Monica
Aber sind Sie sich irgendeines Problems bewusst, das auftreten könnte? Wenn sie eine Funktion verwenden, die unser Compiler nicht unterstützt, wird der Code einfach nicht kompiliert.
LaboPie
1
Ein kleiner Anhang, natürlich wird das Problem größer, wenn der vom anderen Büro verwendete Compiler kein großer war. ZB ein alter Konsolen-Compiler oder etwas, das mit einer Teilmenge der Sprache funktioniert.
LaboPie
1

Ein großes Problem beim Ändern von Compilern ist undefiniertes Verhalten: Wenn der empfangene Code undefiniertes Verhalten hervorruft, ist alles möglich - einschließlich der Tatsache, dass der Code einwandfrei funktioniert und alle Tests bei Verwendung des Compilers bestanden hat.

Das ist möglich, aber in dieser Situation kann es auch zu Problemen kommen, wenn Sie die Optimierungsstufe ändern, die nächste Version desselben Compilers verwenden usw. Also nichts, was du vermeiden kannst.

gnasher729
quelle
Dies ist ein gutes Argument für die Verwendung von Flusen und möglicherweise Valgrind .