Frage

Was sollte beim Schreiben plattformübergreifender Anwendungen in C am meisten beachtet werden?Gezielte Plattformen:32-Bit-Intel-basierter PC, Mac und Linux.Ich bin besonders auf der Suche nach der Vielseitigkeit, die Jungle Disk in seiner USB-Desktop-Edition bietet ( http://www.jungledisk.com/desktop/download.aspx )

Was sind Tipps und „Fallstricke“ für diese Art der Entwicklung?

War es hilfreich?

Lösung

Ich habe mehrere Jahre lang eine ANSI-C-Netzwerkbibliothek gepflegt, die auf fast 30 verschiedene Betriebssysteme und Compiler portiert wurde.Die Bibliothek hatte keine GUI-Komponenten, was es einfacher machte.Am Ende haben wir alle Routinen, die nicht plattformübergreifend konsistent waren, in dedizierte Quelldateien abstrahiert und in diesen Quelldateien gegebenenfalls #defines verwendet.Dadurch wurde der pro Plattform angepasste Code von der Hauptgeschäftslogik der Bibliothek isoliert.Wir haben außerdem in großem Umfang Typedefs und unsere eigenen dedizierten Typen genutzt, sodass wir sie bei Bedarf problemlos je nach Plattform ändern können.Dies machte die Portierung auf 64-Bit-Plattformen ziemlich einfach.

Wenn Sie nach GUI-Komponenten suchen, empfehle ich einen Blick auf GUI-Toolkits wie WxWindows oder Qt (bei beiden handelt es sich um C++-Bibliotheken).

Andere Tipps

Versuchen Sie, plattformabhängige #ifdefs zu vermeiden, da diese dazu neigen, exponentiell zu wachsen, wenn Sie neue Plattformen hinzufügen.Versuchen Sie stattdessen, Ihre Quelldateien als Baum mit plattformunabhängigem Code im Stammverzeichnis und plattformabhängigem Code in den „Blättern“ zu organisieren.Es gibt ein schönes Buch zu diesem Thema, Multiplattform-Codeverwaltung.Der darin enthaltene Beispielcode sieht vielleicht veraltet aus, aber die im Buch beschriebenen Ideen sind immer noch äußerst wichtig.

Zusätzlich zu Kyles Antwort würde ich es wärmstens empfehlen gegen Ich versuche, das Posix-Subsystem in Windows zu verwenden.Es ist auf ein absolutes Minimum implementiert, sodass Microsoft „Posix-Unterstützung“ in einem Kontrollkästchen für ein Feature-Sheet beanspruchen kann.Vielleicht benutzt es jemand da draußen tatsächlich, aber ich habe es im wirklichen Leben noch nie erlebt.

Man kann durchaus plattformübergreifenden C-Code schreiben, man muss sich nur der Unterschiede zwischen den Plattformen bewusst sein und testen, testen, testen.Unit-Tests und eine CI-Lösung (Continuous Integration) tragen wesentlich dazu bei, sicherzustellen, dass Ihr Programm auf allen Ihren Zielplattformen funktioniert.

Ein guter Ansatz besteht darin, die systemabhängigen Dinge in einem oder höchstens einigen wenigen Modulen zu isolieren.Stellen Sie eine systemunabhängige Schnittstelle von diesem Modul bereit.Bauen Sie dann alles andere auf diesem Modul auf, sodass es nicht von dem System abhängt, für das Sie kompilieren.

Versuchen Sie, so viel wie möglich mit POSIX zu schreiben.Mac und Linux unterstützen POSIX nativ und Windows verfügt über ein System, auf dem es ausgeführt werden kann (soweit ich weiß, habe ich es noch nie verwendet).Wenn Ihre App grafisch ist, unterstützen sowohl Mac als auch Linux X11-Bibliotheken (Linux nativ, Mac über X11.app) und es gibt zahlreiche Möglichkeiten, X11-Apps unter Windows zum Laufen zu bringen.

Wenn Sie jedoch auf der Suche nach einer echten Multiplattform-Bereitstellung sind, sollten Sie wahrscheinlich zu einer Sprache wie Java oder Python wechseln, die in der Lage ist, dasselbe Programm auf mehreren Systemen ohne oder mit nur geringen Änderungen auszuführen.

Bearbeiten:Ich habe gerade die Anwendung heruntergeladen und mir die Dateien angesehen.Es scheint, dass es Binärdateien für alle drei Plattformen in einem Verzeichnis gibt.Wenn es Ihnen darum geht, Apps zu schreiben, die von Computer zu Computer verschoben werden können, ohne dass Einstellungen verloren gehen, sollten Sie wahrscheinlich Ihre gesamte Konfiguration in eine Datei im selben Verzeichnis wie die ausführbare Datei schreiben und nicht die Windows-Registrierung berühren oder irgendwelche Punktverzeichnisse darin erstellen der Home-Ordner des Benutzers, der das Programm unter Linux oder Mac ausführt.Und was die Erstellung einer verteilungsübergreifenden Linux-Binärdatei angeht, wäre 32-Bit-POSIX/X11 wahrscheinlich die sicherste Wahl.Ich bin mir nicht sicher, was JungleDisk verwendet, da ich derzeit einen Mac verwende.

Es gibt nur wenige tragbare Bibliotheken, nur Beispiele, mit denen ich in der Vergangenheit gearbeitet habe

1) Glib und GTK+

2) libcurl

3) libapr

Diese decken nahezu jede Plattform ab und sind daher ein äußerst nützliches Werkzeug.

Posix ist unter Unices in Ordnung, aber ich bezweifle, dass es unter Windows so gut ist, außerdem haben wir dort kein Material für tragbare GUIs.

XVT verfügt über eine plattformübergreifende GUI-C-API, die seit über 15 Jahren ausgereift ist und auf den nativen Fenster-Toolkits aufbaut. Siehe WWW.XVT.COM.

Sie unterstützen mindestens LINUX, Windows und MAC.

Ich unterstütze auch die Empfehlung, Code für verschiedene Plattformen in verschiedene Module/Bäume statt in ifdefs aufzuteilen.

Außerdem empfehle ich, vorher zu prüfen, welche Unterschiede zwischen Ihren Plattformen bestehen und wie Sie diese abstrahieren können.Z.B.Dabei handelt es sich um einige Dinge, die mit dem Betriebssystem zu tun haben (z. B.das lästige CR, CRLF, LF in Textdateien) oder Hardware-Sachen.Z.B.Die zuvor erwähnte Posix-Kompatibilität hält Sie nicht davon ab

int c;
fread(&c, sizeof(int), 1, file);

Auf verschiedenen Hardwareplattformen kann das interne Speicherlayout jedoch völlig unterschiedlich sein (Endianess), sodass Sie auf einigen Zielplattformen Konvertierungsfunktionen verwenden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top