Sind C++ - Anwendungen cross-Plattform?
Eines der ersten Dinge, die ich lernte, als student, war, dass C++ - Anwendungen laufen nicht auf anderen Betriebssystemen. Vor kurzem habe ich gelesen, dass die Qt-basierte C++ - Anwendungen überall laufen. Also, was ist Los? Sind C++ - Anwendungen, cross-Plattform, oder nicht?
- Nur wenn Sie schreiben Sie werden.
- programmers.stackexchange.com/questions/281851/...
- Es hängt davon ab, was du meinst, wenn du "C++ - Anwendung". Windows-Anwendungen, zum Beispiel, kann in C++ geschrieben, und es ist unwahrscheinlich, dass die Ausführung auf einer anderen Plattform. Qt, WxWidgets, SDL oder ähnliche Produkte die helfen könnten, erstellen Multiplattform-Anwendung.
- 8 die Leute denken, das ist gut erforscht. Weil portable code ist ein Thema, das nur selten abgedeckt in C++ Recht Jungs?
- Es hängt auch davon ab, was meinen Sie mit "cross-platform": Code tragbar (C++), und binären portable C++ nicht).
- Ich meine die Anwendung, nicht der Sprache. Ich lese in der Qt offiziellen website, dass C++ - Anwendungen überall laufen.
- Qt ist in der Binär-Kompatibilität Geschäft, so würden Sie sagen, dass. Sie meinen, wenn Sie die richtigen tools und APIs und Laufzeitumgebungen, und Sie tun die richtigen Dinge wie ein Entwickler sind, können Sie cross-Plattform deliverables. Das hat weniger mit C++ und mehr zu tun, naja, tools, APIs und Laufzeitumgebungen.
- Die Anwendungen sind nicht cross-Plattform, aber der code sein kann.
- Qt-code - cross-Plattform-Probleme gelöst sind, indem Sie, wenn Sie Ihre Bibliotheken. zB., Wenn Sie eine Microsoft-Funktion zum Lesen einer Datei, es funktioniert unter Windows aber nicht Linux, wenn Sie die Qt-Funktion zum Lesen einer Datei, die Sie gemacht haben wird es auf beiden Plattformen funktionieren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Source-code-kompatibel. Wenn ich den Quellcode kompilieren, wird es überall laufen.
API/ABI-Kompatibilität. Hat das Betriebssystem die Schnittstelle, um Ihre Komponenten in einer Weise, die den code verstehen?
Binär-Kompatibilität. Ist der code läuft problemlos auf dem Ziel-host?
Source-code kompatibel
C++
ist ein standard, der definiert, wie Strukturen, Speicher, Dateien gelesen und geschrieben werden können.Code geschrieben, um Daten zu verarbeiten (z.B.
grep
,awk
,sed
) ist in der Regel cross-Plattform.Wenn Sie möchten, um mit dem Benutzer interagieren, moderne Betriebssysteme eine GUI, diese sind nicht cross-Plattform, und-Ursache code für eine bestimmte Plattform.
Bibliotheken wie
qt
oderwxWidgets
haben-Implementierungen für verschiedene Plattformen und ermöglichen es Ihnen, um das Programm fürqt
stattWindows
oderiOS
, das Resultat ist kompatibel mit beiden.Das problem mit diesen die Anonymisierung Bibliotheken, Sie nehmen einige der spezifischen Vorteile der Plattform X-Weg im Interesse der Einheitlichkeit über Plattformen hinweg.
Beispiele HIERFÜR wären auf
Windows
mit derWaitForMultipleObjects
- Funktion, die ermöglicht es Ihnen, zu warten, für verschiedene Arten von Ereignissen auftreten, oder diefork
Funktion auf UNIX, die es erlaubt zwei Kopien der Prozess ausgeführt werden, die mit erheblichen freigegebenen Zustand. In der UI, die Formen sehen aus und Verhalten sich etwas anders (z.B. color-picker, maximieren, minimieren, die Fähigkeit zu verfolgen, die Maus außerhalb des Fensters, das Verhalten der gesten).Wenn die Arbeit, die Sie getan werden müssen, ist wichtig für Sie, dann können Sie am Ende zu wollen, schreiben Plattform-spezifischen code, um nutzen Sie die Vorteile von der spezifischen Anwendung.
Den
C
Bibliotheksqlite
ist breit cross-Plattform-code, aber seine low-level-IO ist Plattform-spezifisch, also kann es garantiert für die Integrität der Datenbank (dass die Daten wirklich auf die Festplatte geschrieben).Damit Bibliotheken wie Qt-Arbeit zu tun, Sie kann, zu Ergebnissen, die unbefriedigend sind, und Sie am Ende mit zu schreiben nativen code.
API/ABI-Kompatibilität
Verschiedenen Versionen von UNIX und Windows haben irgendeine form der Kompatibilität mit jeder anderen. Diese erlauben eine binäre gebaut für eine version von OS ausgeführt werden, die auf anderen Versionen des Betriebssystems.
In UNIX der Auswahl Ihrer build-Maschine definiert, die die Kompatibilität. Die niedrigste OS revision, die Sie unterstützen wollen, sollten Sie Ihre Maschine bauen, und es wird produzieren binaries kompatibel mit nachfolgenden kleinen Versionen, bis Sie eine bedeutende änderung (aufgelassen einer Bibliothek).
Unter Windows und Mac OS X, wählen Sie ein SDK, können Sie gezielt eine Reihe von OS mit den gleichen Problemen mit den aktuellen änderungen.
Unter Linux, jedes kernel-revision ABI-inkompatibel mit jeder anderen, und die kernel-Module müssen neu kompiliert werden für jede kernel-revision.
Binär-Kompatibilität
Dies ist die Fähigkeit der CPU, um den code zu verstehen. Dies ist komplexer, als Sie vielleicht denken, wie der x64-chips, können der Lage sein, (je nach OS-support) für die Durchführung von x86-code.
Normalerweise ein C++ - Programm ist verpackt in einem container (PE ausführbare ELF-format), die vom Betriebssystem verwendet werden, um entpacken Sie die Abschnitte des Codes und der Daten und um Bibliotheken zu laden. Dies macht das fertige Programm haben beide binary (code-Typ) und API (format der container) Formen der Unverträglichkeiten.
Auch heute, wenn Sie kompilieren eine x86-Windows-Anwendung (für Windows 7 über Visual Studio 2015), dann kann der code nicht ausgeführt, wenn der Prozessor keine SSE2-Anweisungen (über 10 Jahre alte CPU).
Schließlich bei Apple geändert von PowerPC zu x86, sofern Sie eine Emulations-Schicht, die erlaubt, die alten PowerPC code laufen in einem emulator auf der x86-Plattform.
So im Allgemeinen Binär-Inkompatibilität ist eine trübe Gegend. Es wäre möglich, ein OS, welches identifiziert ungültige Anweisungen (z.B. SSE2) und in der Schuld ist, emuliert das Verhalten, das aktualisiert werden kann, wenn neue Funktionen kommen, und hält Ihren code ausführen, obwohl es Binär ist nicht kompatibel.
Selbst wenn Ihre Plattform nicht fähig ist ein Formular ausgeführt von Befehlssatz, könnte es emuliert werden und Verhalten sich kompatibel.
%APPDATA%
Meine Dokumente, die Benutzer home-Ordner, etc., während der *nix-neigt dazu, nur haben die letzteren standardmäßig verwenden kann und dotfiles zu implementieren APPDATA-wie Verhalten.Standard-C++ cross-Plattform in der "write once, compile anywhere" Sinn, aber nicht in der "compile once, run anywhere" - Gefühl.
Dass bedeutet, dass wenn Sie ein Programm schreiben in C++ - standard, können Sie kompilieren und führen Sie es auf jedem target-Umgebung, die eine standard-konforme Implementierung von C++.
Können Sie jedoch nicht kompilieren Sie das Programm auf Ihrem Rechner, versenden das binary und dann erwarten, dass es funktioniert auf andere Ziele. (Zumindest nicht im Allgemeinen. Man kann sich natürlich verteilen, Programme von C++ - code unter bestimmten Bedingungen, aber diese abhängig sind von dem tatsächlichen Ziel. Dies ist ein weites Feld).
Natürlich, wenn Sie zusätzliche, nicht-standard-Funktionen, wie gcc die variable length arrays oder Bibliotheken von Drittanbietern, können Sie nur kompilieren auf Systemen, die diese Erweiterungen und Bibliotheken.
Einige Bibliotheken wie Qt und Boost sind verfügbar auf vielen Systemen (diese beiden auf Linux -, Mac-und Windows-zumindest glaube ich), sodass Ihr code wird bleiben, cross-Plattform, wenn Sie diese verwenden.
Du kann erreichen, dass Ihre Quelle kompiliert auf verschiedenen Plattformen, so dass Sie verschiedene Programme von der selben source-Basis.
Dies ist nicht "compile once, run anywhere mit einer entsprechenden VM" als Java oder C# zu tun, aber "write once, kompilieren überall mit einer entsprechenden Umgebung" der Weg C hat es getan, die ganze Zeit.
Da die standard-Bibliothek nicht alles, was Sie brauchen könnten, Sie haben sich für third-party-Bibliotheken-Funktionalität. Bestimmte Rahmenbedingungen -- wie Boost, Qt, GTK+, wxWidgets, etc. -- kann vorsehen, dass. Da diese frameworks sind in einer Weise geschrieben, dass Sie kompilieren auf verschiedenen Plattformen, die Sie erreichen können, cross-Plattform-Funktionalität im vorstehenden Sinne.
Gibt es verschiedene Dinge zu beachten, wenn Sie möchten, dass Ihre C++ - code cross-Plattform.
Die offensichtliche Sache ist die Quelle, die macht übernahme auf Daten-Typen. Ihre
long
möglicherweise 32bit hier und 64bit gibt. Daten, Typ, Ausrichtung und Struktur, die Polsterung kann sich unterscheiden. Es gibt Möglichkeiten, um auf der "sicheren" hier, wiesize_t
/size_type
/uint16_t
Typdefinitionen etc., und Möglichkeiten, um es falsch, wiewchar_t
undstd::wstring
. Es braucht Disziplin und eine gewisse Erfahrung, um "get it right".Nicht alle Compiler sind gleich geschaffen. Sie können nicht verwenden die neueste C++ - Sprache-Funktionen, oder verwenden Sie Bibliotheken, die sich auf diese Funktionen, wenn Sie benötigen, Ihre Quelle zu kompilieren, die auf andere C++ - Compiler. Überprüfen Sie die compatibility chart ersten.
Andere Sache ist endian Typ. Nur ein Beispiel, wenn Sie schreiben ein stream von ganzen zahlen in eine Datei auf einer Plattform (z.B. x86 oder x86_64), und dann Lesen Sie es wieder auf einer anderen Plattform (z.B. ENERGIE), können Sie auf Probleme stoßen. Warum würden Sie schreiben zahlen in die Datei? Gut, UTF-16 ist Ganzzahlen... wieder, Disziplin und eine gewisse Erfahrung gehen einen langen Weg in Richtung macht diese eher schmerzlos.
Sobald Sie geprüft haben, alle diese Boxen, die Sie benötigen, um sicherzustellen, dass der Verfügbarkeit der Bibliotheken Sie stützen Ihren code auf. Während
std::
sicher ist (siehe aber "nicht alle Compiler sind gleich geschaffen" oben), etwas so unschuldig, wieboost::
zum problem werden kann, wenn Sie schauen, jenseits des mainstream. (Ich half den Boost-Jungs zu beheben, eine oder zwei Showstopper in Bezug auf AIX /Visual Age in den letzten Jahren einfach, weil Sie nicht haben, Zugang zu dieser Plattform zum testen von neuen releases...)Oh, und watch out für die verschiedenen Genehmigungsverfahren gibt. Einige frameworks, die Ihre cross-Plattform-Funktionen -- wie Qt oder Cygwin-haben Ihre strings attached. Das ist nicht zu sagen, Sie sind nicht eine große Hilfe in den richtigen Umständen, nur, dass Sie brauchen, um bewusst sein, copyleft /proprietärer Lizenzierung Anforderungen.
Alle, dass gesagt wird, es ist Wein ("der Wein ist keine emulation"), die ausführbare Dateien zusammengestellt für Windows laufen auf einer Vielzahl von Unix-ähnlichen Systemen (Linux, OS X, *BSD, Solaris). Es gibt gewisse Grenzen für Ihre Fähigkeiten, aber es ist immer besser die ganze Zeit.
extern "c"
für interop 😀gtkmm
Bindungen, anstatt neu zu erfinden das Rad. Plus,gtkmm
macht viel mehr Aufwand, die Verwendung von standard-C++ - Funktionen, wo immer möglich, wodurch eine viel bessere Kodierung (und in meinem Fall -, Lern -) Erfahrung, IMO.Ja. Nein. Vielleicht. Was ist cross-Plattform C++ - code? Cross-Plattform C++ - code ist wie ein code, der kompiliert werden kann unter verschiedenen Betriebssystemen, ohne die Notwendigkeit geändert werden.
Das bedeutet, dass, wenn Sie explizit jede Plattform-abhängigen Header, dein code ist nicht mehr cross-Plattform. Qt löst dieses problem auf die folgende Art und Weise: Sie stellen Wrapper für alles, was ist Plattform-spezifisch. Zum Beispiel, stellen Sie sich vor, dass Sie mit
QFile
zu öffnen/Lesen/schreiben einer Datei. Dein code sieht aus wieSie können diesen code kompilieren unter jedem OS so lange, wie Sie einen geeigneten compiler und Qt-Bibliotheken für das OS. Der code versteckt sich unter
QFile
verwenden der OS-entsprechende Datei-handling-Funktionen, aber das sollte nicht dich betreffen.Auch, wenn man nur die standard-Bibliothek, der code kann kompiliert werden, überall dort, wo ein C++ - compiler vorhanden ist.
Den bereits kompilierten Anwendungen sind jedoch nicht cross-Plattform in einer Weise, die, sagen wir, Java-Anwendungen - zum Beispiel, können Sie nicht kompilieren einer app für Windows und dann Linux, müssen Sie kompilieren Sie Ihren code unter Linux statt.
C++ ist eine Programmiersprache. Text. Als solche, es läuft nicht überall.
Konforme Standard-C++ - code wird erwartet, dass Verhalten gleichermaßen auf einer beliebigen Plattform; "cross-Plattform", wenn Sie wollen. Schreiben (streng) konformen C++ - code benötigt Pedanterie, da einige Annahmen oft aus Abhängigkeiten zu den details, die endgültig sind, um die tatsächliche Umsetzung und das ist geerbt von den Zielen C++ selbst will.
Bemerken wir reden immer noch über C++ - code, der nicht C++ - Programme. In der Tat, wenn wir gehen zu den Begriff "Programm", wir haben nicht mehr garantiert, denn wir sprechen hier nicht über C++ mehr, sondern die Ausgabe des Compilers. Dies ist, wo Portabilität beginnt zu verblassen: executable-format, ISA, ABI, low-level-Routinen und so weiter.
Können Sie sich darauf verlassen, dass? Wenn Sie nicht können, dann müssen Sie integrieren Ihr C++ - Programm in die Umgebung, in der er ausgeführt wird, durch kompilieren oder mit Plattform-spezifischen Elemente.
C++ cross-Plattform. Sie können es verwenden, um Anwendungen zu erstellen, die läuft auf vielen verschiedenen Betriebssystemen.
Was ist nicht cross-Plattform ist der Compiler, dass die übersetzen C++ in object-code. Keine einzige compiler, meines Wissens nach, hat alle notwendigen Funktionen, so dass, wenn Sie es verwenden, zu kompilieren eines C++ - Programms, wird es automatisch ausgeführt werden, auf Windows, Linux und Mac OS.
Qt Creator integriert ist, mit mehreren Compilern und hat die build-Automatisierung. Es ermöglicht ein einfaches Umschalten zwischen verschiedenen setups und Zielplattformen. Es bietet Unterstützung für das erstellen, ausführen und bereitstellen von C++ - Anwendungen, die nicht nur für desktop-Umgebungen, aber auch für mobile Geräte.