C++ partout : écrire du code pour Windows, Linux et macOS en même temps

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Un jour, tu écriras un code qui fonctionnera partout

\n

Imagine : tu crées un super projet en C++, tout fonctionne parfaitement sous Windows. Ton ami te demande de compiler une version pour Linux. Tu soupires, tu plonges dans le Makefile, tu changes les chemins, les compilateurs, tu tombes sur #ifdef _WIN32 et trois heures plus tard, tu obtiens un binaire qui plante quand même avec une segmentation fault. Ça te dit quelque chose ?

\n

Le développement multiplateforme en C++ n'est pas de la magie, mais un ensemble de disciplines et d'outils. Dans cet article, nous allons voir comment écrire du code qui fonctionne sur Windows, Linux et macOS sans larmes, avec des exemples de code réel et des solutions prêtes à l'emploi. C'est parti !

\n\n

Pourquoi C++ est idéal pour la multiplateforme (et pourquoi c'est galère)

\n

Les points forts du C++ — la compilation, les performances et le contrôle de la mémoire — en font le roi de la programmation système. Mais cela a un prix : chaque OS a ses propres API, compilateurs (MSVC, GCC, Clang) et particularités du système de fichiers.

\n

Les principaux pièges :

\n
    \n
  • Fichiers d'en-tête différents — windows.h vs unistd.h
  • \n
  • Macros différentes — _WIN32, __linux__, __APPLE__
  • \n
  • Compilateurs différents — MSVC n'aime pas les extensions GCC
  • \n
  • Bibliothèques différentes — chargement dynamique (DLL vs .so)
  • \n
\n

Mais n'aie pas peur — tous ces problèmes sont résolubles. L'essentiel est de choisir la bonne approche dès le départ.

\n\n

Outil n°1 : CMake — ton assembleur universel

\n

Si tu écris une application multiplateforme en C++, ton meilleur ami est CMake. Ce n'est pas un système de build comme Make, mais un générateur de fichiers de build : il crée des Makefile pour Linux/macOS et des .sln pour Visual Studio sous Windows.

\n

Voici un CMakeLists.txt minimal qui fonctionne partout :

\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# Ajout du fichier exécutable\nadd_executable(myapp main.cpp utils.cpp)\n\n# Gestion multiplateforme\nif(WIN32)\n    target_compile_definitions(myapp PRIVATE PLATFORM_WINDOWS)\n    target_link_libraries(myapp PRIVATE ws2_32)  # sockets sous 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

Comme tu le vois, target_compile_definitions permet de définir des macros pour chaque plateforme. Dans le code, tu les utilises ainsi :

\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 est la norme de facto. Si ton projet ne l'utilise pas, il est temps de changer d'approche.

\n\n

Boost et Qt : des solutions prêtes pour les problèmes complexes

\n

Tout écrire de zéro est le lot des héros et des masochistes. Pour le développement multiplateforme en C++, il existe des bibliothèques matures qui masquent les différences entre OS.

\n

Boost — le couteau suisse

\n

Boost.Asio — pour la programmation réseau (fonctionne aussi bien sous Windows que sous Linux). Boost.Filesystem — pour la gestion des fichiers (remplace std::filesystem si tu as un vieux compilateur). Exemple de lecture multiplateforme d'un répertoire :

\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

Ce code se compile sous n'importe quel OS sans un seul #ifdef.

\n\n

Qt — un framework complet

\n

Si tu as besoin d'une interface graphique, de gestion réseau, de bases de données ou de multithreading — Qt est ton choix. Il fournit une API unifiée pour toutes les plateformes. Lors

Blogs

Book Recommendations