C++ sur macOS : comment compiler du code natif et quel langage choisir

C++ sur macOS : comment compiler du code natif et quel langage choisir

Programmer en C++ sur Mac est généralement plus simple qu’il n’y paraît pour ceux qui viennent de Linux. macOS inclut Apple Clang en tant que compilateur C et C++, avec libc++ comme bibliothèque standard. Les Command Line Tools fournissent tout le nécessaire pour commencer depuis le Terminal. Sur les Macs récents, le code est compilé nativement pour l’architecture ARM64 d’Apple Silicon.

Les essentiels de C++ sur macOS en 30 secondes

  • Apple utilise Clang et LLVM comme outils de développement officiels.
  • Les Command Line Tools permettent de compiler du C et du C++ sans installer Xcode complet.
  • Les Macs Apple Silicon produisent généralement des exécutables ARM64 au format Mach-O.
  • Swift est la principale option pour les nouvelles applications Apple, tandis que C++ est idéal pour le développement multiplateforme et les logiciels performants.
  • C, Objective-C et Metal conservent des usages spécifiques au sein de la plateforme.

Pour les développeurs et administrateurs habitués à Linux, la principale différence réside dans l’environnement et les outils qui entourent le langage. Au lieu de GCC, glibc et des exécutables ELF, macOS utilise Apple Clang, libc++, ses SDK proprios, les binaires Mach-O, ainsi que des outils comme xcrun, otool ou LLDB.

Préparer macOS pour compiler en C++

Il n’est pas nécessaire d’installer Xcode en entier pour débuter. Les Command Line Tools peuvent s’installer directement depuis le Terminal :

xcode-select --install

Il est ensuite utile de vérifier la version du compilateur :

clang++ --version

Sur un Mac avec Apple Silicon, cela devrait afficher une cible ressemblant à :

Target: arm64-apple-darwin...

Il est aussi pratique de connaître la localisation du compilateur et du SDK utilisés :

xcrun --find clang++
xcrun --show-sdk-path

Voici un simple programme, sauvegardé en hello.cpp :

#include 
#include 

int main()
{
    std::string name;

    std::cout << "Nom : ";
    std::getline(std::cin, name);

    std::cout << "Bonjour, " << name << "!n";

    return 0;
}

Pour le compiler :

clang++ hello.cpp -o hello

Et pour l’exécuter :

./hello

Dans un contexte moderne, il est conseillé de spécifier la norme C++ et d’activer les warnings :

clang++ -std=c++20 -Wall -Wextra -Wpedantic hello.cpp -o hello

Clang permet d’utiliser des standards plus récents, mais la prise en charge dépend de la version d’Apple Clang et libc++. Il ne faut donc pas supposer que C++23 soit entièrement supporté de suite.

Pour le débogage, on peut ajouter l’option -g :

clang++ -std=c++20 -g hello.cpp -o hello
lldb ./hello

LLDB, intégré dans l’environnement LLVM d’Apple, remplace GDB pour les tâches de débogage classiques.

Apple Silicon et différences avec Linux

Les Mac modernes sont équipés de processeurs Apple Silicon basés sur ARM64. La vérification est simple :

uname -m

Sur ces machines, cela renverra :

arm64

On peut également examiner un exécutable :

file ./hello

Le résultat habituel sera quelque chose comme :

Mach-O 64-bit executable arm64

Mach-O est le format utilisé par les binaires sous macOS, contrasting au format ELF commun sous Linux.

Pour rechercher les bibliothèques dynamiques qu’un programme utilise :

otool -L ./hello

Cet outil est particulièrement utile pour les administrateurs lorsqu’un programme fonctionne sur un Mac mais pas sur un autre, à cause d’un problème de dépendance ou d’architecture incompatible.

Clang permet aussi de cibler explicitement l’architecture :

clang++ -arch arm64 hello.cpp -o hello-arm64

Et, si le contexte le permet, générer un exécutable x86-64 :

clang++ -arch x86_64 hello.cpp -o hello-x86_64

macOS supporte aussi les Universal Binaries, contenant plusieurs architectures. C’est encore utile pour distribuer une application aussi bien aux Mac Intel qu’aux Apple Silicon, même si de plus en plus, les nouveaux environnements utilisent exclusivement ARM64.

Pourquoi bits/stdc++.h ne fonctionne pas sur macOS

Un obstacle fréquent lors de la migration de code Linux est l’utilisation de :

#include <bits/>

Cette entête ne fait pas partie du standard C++. Elle est principalement associée à libstdc++ de GNU, et ne doit pas être considérée comme compatible avec la configuration standard d’Apple.

Une alternative portable consiste à inclure explicitement les entêtes nécessaires :

#include 
#include 
#include 
#include 

Ce procédé fonctionne avec libc++ et facilite la portabilité du code entre différents toolchains.

Swift, C++, C ou Objective-C : quel langage privilégier sur Apple ?

Le C++ n’est qu’une option parmi d’autres pour créer des logiciels natifs sur Mac. Apple maintient plusieurs langages avec des usages spécifiques bien définis :

Langage Usage privilégié
Swift Applications modernes pour macOS, iOS, iPadOS, watchOS, visionOS
C++ Moteurs, HPC, multimédia, bibliothèques, logiciels multiplateformes
C Systèmes, POSIX, réseautage, bibliothèques de bas niveau
Objective-C Maintien et intégration avec l’écosystème Cocoa existant
Objective-C++ Intégration entre Cocoa et C++
Metal Shading Language Graphisme et calcul sur GPU

Swift est le choix idéal pour une grande partie des nouvelles applications spécifiquement destinées aux plateformes Apple. Il donne un accès direct à SwiftUI, Foundation, AppKit, tout en étant parfaitement adapté pour créer des outils en ligne de commande.

Le C++ garde une place privilégiée dans les domaines où la compatibilité multiplateforme est essentielle, et pour les applications de haute performance, comme les moteurs, les librairies ou les traitements multimédias.

Apple facilite aussi l’interopérabilité entre Swift et C++, permettant ainsi de maintenir des bibliothèques ou moteurs en C++ tout en développant la partie spécifique à macOS en Swift.

Le C reste pertinent pour tout ce qui concerne la programmation système et les API POSIX, tandis qu’Objective-C continue d’être utilisé dans une grande partie du code ancien de macOS.

La Metal Shading Language est quant à elle réservée aux shaders et kernels en GPU, utilisant Metal pour leur exécution.

Des langages comme Rust, Go ou Zig peuvent également produire des exécutables natifs pour macOS et Apple Silicon, mais utilisent leurs propres process de compilation et n’offrent pas la même intégration native avec l’écosystème Apple.

Outils essentiels à connaître sur macOS

Outre clang++, quelques commandes permettent d’identifier rapidement la majorité des problèmes liés à un logiciel natif :

Outil Utilité
clang / clang++ Compilation en C/C++
xcrun Localiser outils et SDK
lldb Débogage
file Identifier architecture et format
otool Inspection des binaires et bibliothèques
lipo Examiner ou créer des binaires multiaarchitektur
codesign Vérification et gestion de signatures
spctl Contrôle de conformité du logiciel avec les politiques macOS

Pour des projets C++, qui deviennent souvent plus complexes, il est aussi judicieux d’utiliser CMake à la place de scripts de compilation manuels :

cmake_minimum_required(VERSION 3.20)

project(MacTool LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(mactool src/main.cpp)

Pour construire, il suffit de lancer :

cmake -S . -B build
cmake --build build

Ce modèle facilite la gestion de projets en simultané sous macOS et Linux.

En résumé, pour un développeur Linux, apprendre C++ sur macOS ne requiert pas de repartir de zéro : le langage reste le même. Cependant, l’environnement a changé : Apple Clang plutôt que GCC, libc++, format Mach-O, SDK spécifiques et architecture ARM64 prédominante.

Comprendre ces différences permet de passer rapidement d’un petit programme compilé en terminal à des projets cross-plateforme ou des outils natifs pour gérer une flotte de Mac.

Foire aux questions

Faut-il installer Xcode pour compiler en C++ sur macOS ?

Non. Pour la majorité des projets, l’installation des Command Line Tools suffit via xcode-select --install. Xcode complet est utile uniquement si l’on souhaite utiliser l’IDE ou accéder à certains outils spécifiques d’Apple.

Quel compilateur Apple utilise-t-il pour C++ ?

Apple utilise Apple Clang accompagné de libc++. Il fait partie des outils de développement officiels fournis pour macOS.

Quel langage privilégier pour le développement natif sur Mac ?

Swift est la solution principale pour les nouvelles applications spécifiques à l’écosystème Apple. Le C++ est privilégié pour des moteurs performants, des bibliothèques ou des applications multiplateformes où la compatibilité est essentielle.

Le C++ fonctionne-t-il nativement sur Apple Silicon ?

Oui. Clang peut produire des exécutables ARM64 natifs pour Apple Silicon, avec la possibilité de cibler également d’autres architectures si le SDK et l’environnement le permettent.

Sources :

  • Apple Developer, Support du langage C++.
  • Apple Developer, Command Line Tools et documentation Xcode.
  • Apple Developer, Swift.
  • Apple Developer, Metal et metal-cpp.
  • LLVM Project, documentation et support de C++ avec Clang.

le dernier