C++ op macOS: hoe native code te compileren en welke taal te kiezen

Programmeren in C++ op een Mac is aanzienlijk eenvoudiger dan het voor sommigen lijkt, vooral voor gebruikers die gewend zijn aan Linux. macOS beschikt over Apple Clang als compiler voor C en C++, samen met libc++ als standaard bibliotheek. De Command Line Tools bieden alles wat nodig is om te starten vanaf de Terminal. Bovendien wordt code op moderne Macs automatisch gegenereerd voor de ARM64-architectuur van Apple Silicon.

De kernpunten van C++ op macOS in 30 seconden

  • Apple gebruikt Clang en LLVM als onderdeel van zijn officiële ontwikkelomgeving.
  • Met Command Line Tools kunnen C en C++ worden gecompileerd zonder de volledige Xcode IDE te installeren.
  • Moderne Macs met Apple Silicon genereren doorgaans ARM64-uitvoerbare bestanden in Mach-O-formaat.
  • Swift is de primaire keuze voor nieuwe Apple-applicaties, terwijl C++ vooral geschikt is voor multiplatformsoftware en hoge prestaties.
  • C, Objective-C en Metal blijven specifieke rollen vervullen binnen het ecosysteem.

Voor ontwikkelaars en beheerders die gewend zijn aan Linux ligt het belangrijkste verschil in de tools rond de taal. In plaats van het gebruikelijke GCC, glibc en ELF-bestanden, gebruikt macOS Apple Clang, libc++, eigen SDK’s, Mach-O binaries en tools zoals xcrun, otool of LLDB.

MacOS voorbereiden voor C++-ontwikkeling

Het is niet nodig om Xcode volledig te installeren om te beginnen. De Command Line Tools kunnen eenvoudig via de Terminal worden geïnstalleerd:

xcode-select --install

Na installatie kan het beschikbare compilerprogramma worden gecontroleerd:

clang++ --version

Op een Mac met Apple Silicon zou dit ongeveer zo moeten aangeven:

Target: arm64-apple-darwin...

Het is ook handig om de locatie van de compiler en SDK te kennen die worden gebruikt:

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

Een eenvoudig programma kan worden opgeslagen als hello.cpp

#include 
#include 

int main()
{
    std::string name;

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

    std::cout << "Hallo, " << name << "!\n";

    return 0;
}

Om het te compileren, gebruik:

clang++ hello.cpp -o hello

En om het uit te voeren:

./hello

In moderne projecten is het aan te raden het C++-standaard te specificeren en compilerwaarschuwingen te activeren:

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

Clang ondersteunt ook recentere standaarden, maar de volledige beschikbaarheid van features hangt af van de versie van Apple Clang en libc++. Het is daarom niet correct aan te nemen dat C++23 automatisch volledige ondersteuning biedt voor alle nieuwe functies.

Voor debugging kan -g worden toegevoegd:

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

LLDB maakt deel uit van de LLVM-omgeving van Apple, wat het overbodig maakt om GDB te installeren voor standaard debugging-taken.

Apple Silicon en de verschillen met Linux

De nieuwste Macs gebruiken processors gebaseerd op Apple Silicon, op basis van ARM64. De architectuur kan makkelijk gecontroleerd worden:

uname -m

Dit geeft meestal:

arm64

Ook kan worden gekeken naar een uitvoerbaar bestand:

file ./hello

Een gewoon resultaat zal vergelijkbaar zijn met:

Mach-O 64-bit executable arm64

Mach-O is het formaat dat door macOS wordt gebruikt voor uitvoerbare bestanden, in tegenstelling tot ELF op Linux.

Voor het bekijken van de gedeelde bibliotheken die een programma gebruikt, kan deze command gebruikt worden:

otool -L ./hello

Dit is vooral nuttig voor beheerders wanneer een programma op de ene Mac werkt, op een andere niet vanwege afhankelijkheden of incompatibele architectuur.

Clang maakt het ook mogelijk om expliciet de architectuur te kiezen:

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

En, afhankelijk van de omgeving en afhankelijkheden, kan code worden gegenereerd voor x86-64:

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

macOS ondersteunt ook universele binaires, die code bevatten voor meerdere architecturen. Dit blijft handig voor distributie, vooral als een app zowel op Intel-Macs als op Apple Silicon moet draaien, hoewel nieuwe systemen steeds vaker uitsluitend op ARM64 werken.

Waarom bits/stdc++.h niet werkt op macOS

Een veelvoorkomend probleem bij het migreren van Linux-code is het gebruik van:

#include <bits/>

Deze header behoort niet tot de standaard C++-bibliotheek. Het wordt vooral geassocieerd met GNU’s libstdc++ en wordt niet ondersteund door de standaardconfiguratie op Apple-systemen.

Een portable alternatief bestaat uit het expliciet includen van benodigde headers:

#include 
#include 
#include 
#include 

Dit werkt niet alleen met libc++ op macOS, maar maakt ook dat dezelfde code compatibel is met diverse toolchains.

Swift, C++, C of Objective-C: welk taalgebruik past het beste bij Apple?

C++ is slechts een optie voor het ontwikkelen van native Mac-software. Apple ondersteunt verschillende talen, elk met hun eigen functies.

TaalSpecifiek geschikt voor
SwiftNieuwe applicaties voor macOS, iOS, iPadOS, watchOS en visionOS
C++Motoren, HPC, multimedia, bibliotheken en multiplatformsoftware
CSysteemprogrammering, POSIX, netwerken en lage-level bibliotheken
Objective-COnderhoud en integratie met bestaande Cocoa-software
Objective-C++Integratie tussen Cocoa en C++ componenten
Metal Shading LanguageGrafisch schaduwen en GPU computing

Swift is de natuurlijke keuze voor veel nieuwe software die zich richt op Apple-platformen. Het heeft directe toegang tot frameworks zoals SwiftUI, Foundation, en AppKit, maar is ook geschikt voor command-line tools.

C++ behoudt een belangrijke positie, vooral wanneer software op meerdere platforms moet draaien of hoge prestaties moet leveren, zoals bij engines, wetenschappelijke tools, multimediaverwerking en bibliotheken.

Apple ondersteunt ook interoperabiliteit tussen Swift en C++, waardoor het mogelijk is een engine of bibliotheek in C++ te behouden en onderdelen voor macOS in Swift te ontwikkelen.

C blijft relevant voor systeemsoftware en POSIX API’s, terwijl Objective-C nog veel legacy-code vertegenwoordigt binnen macOS-ecosysteem.

De Metal Shading Language richt zich op het schrijven van shaders en kernels voor uitvoering op de GPU via Metal.

Talen als Rust, Go of Zig kunnen ook native executables voor macOS en Apple Silicon produceren, maar maken gebruik van hun eigen toolchains en integreren minder naadloos in het Apple-ontwikkelmodel.

Belangrijke tools voor macOS-ontwikkelaars

Behalve clang++ zijn er enkele essentiële commando’s die helpen bij het diagnosticeren van problemen met native software.

ToolGebruik
clang / clang++Compilatie van C en C++
xcrunHulpmiddelen en SDK’s vinden
lldbDebugging
fileArchitectuur en formaat identificeren
otoolBinair-bestanden en bibliotheken inspecteren
lipoMultiarc binaries bekijken of maken
codesignHandhaven en beheren van codehandtekeningen
spctlSoftware beoordelen op naleving van macOS-beleidsregels

Bij groeiende C++-projecten wordt het vaak verstandig om over te stappen op CMake in plaats van handmatig complexe compilatiecommando’s te blijven gebruiken.

Een eenvoudig voorbeeld van minimale CMake-configuratie:

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)

De build kan worden uitgevoerd met:

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

Dit model is vooral handig voor projecten die gelijktijdig op macOS en Linux moeten blijven werken.

Voor ontwikkelaars uit Linux is leren programmeren in C++ op macOS niet hetzelfde als vanaf nul beginnen. De taal blijft hetzelfde, maar de ontwikkelomgeving wijzigt: Apple Clang in plaats van een standaard GNU-toolchain, libc++, Mach-O, Apple SDK’s en ARM64 als dominante architectuur.

Het begrijpen van deze verschillen vormt de basis om snel van een klein terminalgecompileerd programma naar cross-platform projecten of native tools voor Mac te groeien.

Veelgestelde vragen

Is Xcode vereist om C++ te compileren op macOS?

Nee. Voor veel projecten is alleen het installeren van de Command Line Tools via xcode-select --install voldoende. Xcode zelf is vooral handig voor de IDE en andere specifieke ontwikkeltools van Apple.

Welke compiler gebruikt Apple voor C++?

Apple gebruikt Apple Clang samen met libc++. Dit is onderdeel van de officiële ontwikkeltools van macOS.

Welk programmeertaal is het beste voor native macOS-ontwikkeling?

Swift is de standaardkeuze voor nieuwe apps specifiek voor Apple-platformen. C++ blijft relevant voor engines, bibliotheken en situaties waar hoge prestaties nodig zijn, en wanneer software ook op Linux of Windows moet werken.

Werkt C++ native op Apple Silicon?

Ja. Apple Clang kan native ARM64 uitgaven genereren voor Apple Silicon-processors en ondersteunt ook andere architecturen wanneer de SDK en afhankelijkheden dat toelaten.

Bronnen:

  • Apple Developer, C++ Language Support.
  • Apple Developer, Command Line Tools en documentatie van Xcode.
  • Apple Developer, Swift.
  • Apple Developer, Metal en metal-cpp.
  • LLVM Project, documentatie en ondersteuning voor C++ in Clang.
Scroll naar boven