C++ überall: Code für Windows, Linux und macOS gleichzeitig schreiben

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Eines Tages wirst du Code schreiben, der überall läuft

\n

Stell dir vor: Du erstellst ein cooles Projekt in C++, alles funktioniert perfekt unter Windows. Dein Freund bittet dich, eine Version für Linux zu bauen. Du seufzt, kletterst in das Makefile, änderst Pfade, Compiler, stößt auf #ifdef _WIN32 und bekommst nach drei Stunden eine Binärdatei, die trotzdem mit einem segmentation fault abstürzt. Kommt dir bekannt vor?

\n

Plattformübergreifende Entwicklung mit C++ ist keine Magie, sondern eine Reihe von Disziplinen und Werkzeugen. In diesem Artikel schauen wir uns an, wie man Code schreibt, der unter Windows, Linux und macOS ohne Tränen funktioniert, mit Beispielen für echten Code und fertigen Lösungen. Los geht's!

\n\n

Warum C++ ideal für Plattformunabhängigkeit ist (und warum es wehtut)

\n

Die Stärken von C++ – Kompilierbarkeit, Leistung und Speicherkontrolle – machen es zum König der Systemprogrammierung. Aber dafür muss man bezahlen: Jedes Betriebssystem hat seine eigenen APIs, Compiler (MSVC, GCC, Clang) und Dateisystem-Eigenheiten.

\n

Die häufigsten Fallstricke:

\n
    \n
  • Verschiedene Header-Dateien — windows.h vs unistd.h
  • \n
  • Verschiedene Makros — _WIN32, __linux__, __APPLE__
  • \n
  • Verschiedene Compiler — MSVC mag keine GCC-Erweiterungen
  • \n
  • Verschiedene Bibliotheken — dynamisches Laden (DLL vs .so)
  • \n
\n

Aber keine Angst – all diese Probleme sind lösbar. Hauptsache, du wählst von Anfang an den richtigen Ansatz.

\n\n

Werkzeug Nr. 1: CMake – dein universeller Builder

\n

Wenn du eine plattformübergreifende Anwendung in C++ schreibst, ist dein bester Freund CMake. Es ist kein Build-System wie Make, sondern ein Generator für Build-Dateien: Es erstellt Makefiles für Linux/macOS und .sln für Visual Studio unter Windows.

\n

Hier ist ein minimales CMakeLists.txt, das überall funktioniert:

\n
cmake_minimum_required(VERSION 3.16)\nproject(CrossPlatformApp VERSION 1.0 LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# Ausführbare Datei hinzufügen\nadd_executable(myapp main.cpp utils.cpp)\n\n# Plattformübergreifende Verarbeitung\nif(WIN32)\n    target_compile_definitions(myapp PRIVATE PLATFORM_WINDOWS)\n    target_link_libraries(myapp PRIVATE ws2_32)  # Sockets unter Windows\nelseif(APPLE)\n    target_compile_definitions(myapp PRIVATE PLATFORM_MACOS)\n    target_link_libraries(myapp PRIVATE "-framework CoreFoundation")\nelse()\n    target_compile_definitions(myapp PRIVATE PLATFORM_LINUX)\nendif()
\n

Wie du siehst, ermöglicht target_compile_definitions das Festlegen von Makros für jede Plattform. Im Code verwendest du sie so:

\n
#ifdef PLATFORM_WINDOWS\n    #include <windows.h>\n    void sleep_ms(int ms) { Sleep(ms); }\n#else\n    #include <unistd.h>\n    void sleep_ms(int ms) { usleep(ms * 1000); }\n#endif
\n

CMake ist der De-facto-Standard. Wenn dein Projekt es nicht verwendet, wird es Zeit, den Ansatz zu ändern.

\n\n

Boost und Qt: Fertige Lösungen für komplexe Aufgaben

\n

Alles von Grund auf neu zu schreiben, ist etwas für Helden und Masochisten. Für die plattformübergreifende Entwicklung mit C++ gibt es ausgereifte Bibliotheken, die die Unterschiede der Betriebssysteme verbergen.

\n

Boost – das Schweizer Taschenmesser

\n

Boost.Asio – für Netzwerkprogrammierung (funktioniert sowohl unter Windows als auch unter Linux). Boost.Filesystem – für die Dateiarbeit (ersetzt std::filesystem, falls du einen alten Compiler hast). Beispiel für das plattformübergreifende Lesen eines Verzeichnisses:

\n
#include <boost/filesystem.hpp>\nnamespace fs = boost::filesystem;\n\nvoid list_files(const std::string& path) {\n    for (const auto& entry : fs::directory_iterator(path)) {\n        std::cout << entry.path().string() << std::endl;\n    }\n}
\n

Dieser Code wird unter jedem Betriebssystem ohne ein einziges #ifdef kompiliert.

\n\n

Qt – ein vollwertiges Framework

\n

Wenn du eine GUI, Netzwerkfunktionen, Datenbanken oder Multithreading benötigst, ist Qt deine Wahl. Es bietet eine einheitliche API für alle Plattformen. Bei

Blogs

Buchempfehlungen