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?
Antworten:
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 ++)
quelle
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.
quelle
Hört sich gut an!
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.
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.
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.
quelle
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:
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.
quelle
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.
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.
quelle
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.
quelle