Un jour, tu écriras un code qui fonctionnera partout
\nImagine : 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 ?
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\nPourquoi C++ est idéal pour la multiplateforme (et pourquoi c'est galère)
\nLes 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.
\nLes principaux pièges :
\n- \n
- Fichiers d'en-tête différents —
windows.hvsunistd.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
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\nOutil n°1 : CMake — ton assembleur universel
\nSi 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.
\nVoici un CMakeLists.txt minimal qui fonctionne partout :
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()\nComme tu le vois, target_compile_definitions permet de définir des macros pour chaque plateforme. Dans le code, tu les utilises ainsi :
#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\nCMake est la norme de facto. Si ton projet ne l'utilise pas, il est temps de changer d'approche.
\n\nBoost et Qt : des solutions prêtes pour les problèmes complexes
\nTout é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.
\nBoost — le couteau suisse
\nBoost.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 :
#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}\nCe code se compile sous n'importe quel OS sans un seul #ifdef.
Qt — un framework complet
\nSi 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