Ich beendete eines meiner frühesten C ++ - Projekte, das (laut Framework) plattformübergreifend sein soll. Ich habe das Projekt vollständig in Windows und Visual Studio entwickelt und dachte, da die Bibliotheken alle plattformübergreifend sind, wäre es trivial, den OSX-Build "später" durchzuführen. Dies stellte sich als nicht der Fall heraus, sondern der "Windows-Code" lief nicht richtig und einige Kompilierungsfehler mussten behoben werden.
Welche Techniken sind vorhanden, um vorher sicherzustellen, dass der Code mit allen Plattformen kompatibel ist? Entwickeln Sie alle Plattformen gleichzeitig und testen Sie so den Code gleichzeitig auf allen Plattformen, wenn neue Funktionen hinzugefügt werden, anstatt die verschiedenen Plattformversionen nacheinander zu entwickeln? (*)
Suchen Sie gezielt nach Empfehlungen, die nicht von den Tools abhängen, sondern eher von "Entwicklungsprozessen", die zur plattformübergreifenden Kompatibilität beitragen, unabhängig davon, welche Tools verwendet werden. Wie der (*) oben.
Insbesondere entwickle ich ein VST-Plug-In mit WDL-OL ( https://github.com/olilarkin/wdl-ol ) und einigen plattformübergreifenden DSP-Bibliotheken. WDL-OL-Projekte haben sowohl VS- als auch Xcode-Projekte eingerichtet, aber ich denke, die Probleme kommen von den Bibliotheken und dann von den Unterschieden bei den Compilern.
quelle
Antworten:
Das Erstellen von portablem Code kann sehr schwierig sein.
Zuerst einige offensichtliche sprachbezogene Ratschläge:
Dann ein paar Designempfehlungen:
Zum Schluss die heiklen Punkte:
TCHAR
) verlassen, aber dies kann in Kombination mit der Standardbibliothek eine Herausforderung sein (z. B.cout
vswcout
, je nachdem, obchar
oder verwendet wirdwchar_t
).Dies sind aber nur Ratschläge. In diesem Bereich kann man keine Gewissheit gewinnen.
quelle
-Wall -Wextra -Werror
-pedantic
.Es gibt keine Garantie dafür, dass der Code mit einer anderen Plattform kompatibel ist, als ihn zu erstellen, auszuführen und dort zu testen. Daher besteht der Ansatz aller vernünftigen Menschen darin, ihre Anwendung auf jeder Plattform zu erstellen, auszuführen und zu testen, auf der sie voraussichtlich erstellt, ausgeführt und getestet werden muss.
Continuous Integration (CI) kann diese Belastung für kleinere Projekte ein wenig verringern, da Sie günstige oder kostenlose Build-Agenten für einige Plattformen (hauptsächlich Linux) erhalten, Ihre Entwicklung unter Windows durchführen und bei Problemen einfach zu Linux zurückkehren können.
OSX CI ist allerdings ziemlich knifflig.
quelle
Wenn Sie nach "Entwicklungsprozessen" fragen und Ihre primäre Entwicklungsplattform Windows mit Visual Studio ist, würde ich vorschlagen, Ihr Projekt ohne "windows.h" zu erstellen. Sie erhalten viele Kompilierungsfehler, die Sie auf viele Stellen verweisen, an denen Sie Ihren Code überarbeiten müssen. Zum Beispiel wird 'DWORD' nicht als # definiert und muss durch "
uint32_t
überall" ersetzt werden (google forstdint.h
und Sie finden nützliche Informationen zu Ganzzahltypen und deren plattformübergreifenden Definitionen). Als Nächstes müssen Sie alle Aufrufe der Win32-API ersetzen, z.Sleep()
mit ihrer plattformübergreifenden Entsprechung (auch hier ist Google Ihr bester Freund, der relevante Fragen und Antworten auf Stack * .com-Websites anzeigt). Es wird Ihnen wahrscheinlich nicht gelingen, alle relevanten plattformübergreifenden Ersetzungen für Ihren Code zu finden, und Sie müssen Ihreinclude "windows."
Direktive zurücksenden, aber unterstellen#ifdef _WIN32
- weitere Details finden Sie hierImmer konkretere Fragen stellen und Antworten bekommen - dies ist ein allgemeiner Vorschlag für "Was sollte Entwicklungsprozess sein?"
BEARBEITEN 1 Ein weiterer Vorschlag von mir ist die Verwendung von gcc und / oder clang auf Ihrem Windows-Entwicklungscomputer (zusammen mit Visual Studio).
quelle
Es hängt von den "einigen Kompilierungsfehlern" ab, die Sie erwähnen. Ohne zu wissen, was sie waren, ist es unmöglich, spezifisch zu sein.
Ich habe plattformübergreifenden Code für Windows / Linux / iOS / Android / Mac. Jede neue Plattform brachte einige zusätzliche Fehler und Warnungen mit sich, als sie zum ersten Mal hinzugefügt wurde. Sie werden schnell lernen, welche Konstrukte Probleme bringen. Vermeiden Sie sie oder abstrahieren Sie die Unterschiede in einen Header mit
#ifdef
s. Versuchen Sie niemals,#ifdef
zwischen Plattformen in Ihrem Code selbst zu wechseln.Ein Beispiel:
Erstellt eine temporäre Instanz,
MyClass
die nachmyfunction
der Rückkehr gelöscht wird. Bei einigen meiner C ++ - Compiler ist diese Instanz schreibgeschützt (und die Tatsache, dass sie temporär ist und bald zerstört wird, macht dem Compiler keine Sorgen). Bei anderenmyfunction
muss neu definiert werden, um ein zu nehmenconst MyClass &
, oder der Compiler beschwert sich. Es spielt keine Rolle, was der C ++ - Standard sagt oder welcher Compiler richtig und welcher falsch ist. Nachdem die Begegnung mit dem Fehler ein paar Male , die ich (a) weiß entweder eine temporäre Variable vom Typ deklarierenMyClass
und begebenmyfunction
oder (b) erklären die Referenzconst
inmyfunction
und verwendetmutable
hier und dort deconstify.Fazit: Sammeln Sie Erfahrung und entwickeln Sie Ihre eigenen Codierungsstandards.
quelle
Eine mögliche Möglichkeit, die Portabilität zu verbessern, besteht darin, sich nur auf die vom C ++ 11- Standard bereitgestellten Deklarationen und Funktionen zu verlassen und plattformübergreifende Bibliotheken und Frameworks wie POCO & Qt zu verwenden .
Aber auch das ist nicht ausfallsicher. Erinnere dich an den Aphorismus
Mit Übung, Disziplin und viel Erfahrung kann ein Programm normalerweise schnell auf eine andere Plattform portiert werden. Aber Erfahrung und Know-how sind sehr wichtig.
quelle