C++ en macOS: cómo compilar código nativo y qué lenguaje elegir

Programar en C++ desde un Mac es bastante más sencillo de lo que puede parecer para quien llega desde Linux. macOS dispone de Apple Clang como compilador C y C++, junto con libc++ como biblioteca estándar, y las Command Line Tools proporcionan lo necesario para empezar desde Terminal. En los Mac actuales, además, el código se genera de forma nativa para la arquitectura ARM64 de Apple Silicon.

Las claves de C++ en macOS en 30 segundos

  • Apple utiliza Clang y LLVM como parte de su entorno oficial de desarrollo.
  • Las Command Line Tools permiten compilar C y C++ sin instalar Xcode completo.
  • Los Mac Apple Silicon generan normalmente ejecutables ARM64 en formato Mach-O.
  • Swift es la opción principal para nuevas aplicaciones Apple, mientras C++ encaja especialmente bien en software multiplataforma y de alto rendimiento.
  • C, Objective-C y Metal siguen teniendo usos específicos dentro de la plataforma.

Para desarrolladores y administradores acostumbrados a Linux, la principal diferencia está en las herramientas que rodean al lenguaje. En lugar del entorno habitual formado por GCC, glibc y ejecutables ELF, macOS utiliza Apple Clang, libc++, SDK propios, binarios Mach-O y herramientas como xcrun, otool o LLDB.

Preparar macOS para compilar C++

No es necesario descargar Xcode completo para empezar. Las Command Line Tools pueden instalarse desde Terminal:

xcode-select --install

Después puede comprobarse el compilador disponible:

clang++ --version

En un Mac con Apple Silicon debería aparecer un objetivo similar a:

Target: arm64-apple-darwin...

También resulta útil conocer la ubicación del compilador y el SDK que está utilizando:

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

Un programa mínimo puede guardarse como hello.cpp:

#include <iostream>
#include <string>

int main()
{
    std::string name;

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

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

    return 0;
}

Para compilarlo:

clang++ hello.cpp -o hello

Y para ejecutarlo:

./hello

En proyectos modernos conviene especificar el estándar de C++ y activar los avisos del compilador:

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

Clang permite utilizar estándares más recientes, aunque la disponibilidad real de cada característica depende de la versión de Apple Clang y libc++. Por eso no debería asumirse que seleccionar C++23 implica automáticamente soporte completo de todas sus características.

Para depuración puede añadirse -g:

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

LLDB forma parte del entorno LLVM utilizado por Apple y evita tener que instalar GDB para las tareas habituales de debugging.

Apple Silicon y las diferencias con Linux

Los Mac actuales utilizan procesadores Apple Silicon basados en ARM64. La arquitectura puede comprobarse fácilmente:

uname -m

En estos equipos devolverá:

arm64

También puede inspeccionarse un ejecutable:

file ./hello

El resultado habitual será similar a:

Mach-O 64-bit executable arm64

Mach-O es el formato utilizado por los ejecutables de macOS, frente al formato ELF habitual en Linux.

Para conocer las bibliotecas dinámicas utilizadas por un programa:

otool -L ./hello

Este comando resulta especialmente práctico para administradores cuando un programa funciona en un Mac pero falla en otro por una dependencia o arquitectura incompatible.

Clang también permite seleccionar explícitamente la arquitectura:

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

Y, cuando el entorno y sus dependencias lo permitan, generar código x86-64:

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

macOS admite además Universal Binaries que contienen código para varias arquitecturas. Sigue siendo útil cuando una aplicación debe distribuirse tanto a Mac Intel como a Apple Silicon, aunque cada vez más entornos nuevos pueden trabajar exclusivamente con ARM64.

Por qué bits/stdc++.h no funciona

Un problema habitual al trasladar código desde Linux es encontrar:

#include <bits/stdc++.h>

Esta cabecera no pertenece al estándar C++. Está asociada principalmente al entorno GNU libstdc++, por lo que no debe esperarse que funcione con la configuración estándar de Apple.

La alternativa portable consiste en declarar las cabeceras necesarias:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

Además de funcionar con libc++, este enfoque facilita que el mismo código pueda compilarse con diferentes toolchains.

Swift, C++, C o Objective-C: qué lenguaje tiene más sentido en Apple

C++ es solo una de las posibilidades para desarrollar software nativo en un Mac. Apple mantiene varios lenguajes con funciones diferentes.

LenguajeUso especialmente adecuado
SwiftNuevas aplicaciones macOS, iOS, iPadOS, watchOS y visionOS
C++Motores, HPC, multimedia, bibliotecas y software multiplataforma
CSistemas, POSIX, networking y bibliotecas de bajo nivel
Objective-CMantenimiento e integración con software Cocoa existente
Objective-C++Integración entre Cocoa y componentes C++
Metal Shading LanguageGráficos y computación sobre GPU

Swift es la elección natural para buena parte del nuevo software destinado específicamente a las plataformas de Apple. Tiene acceso directo a SwiftUI, Foundation, AppKit y otros frameworks, pero también puede utilizarse para desarrollar herramientas de línea de comandos.

C++ mantiene una posición especialmente interesante cuando el software tiene que funcionar también en Linux o Windows, o cuando existen requisitos elevados de rendimiento. Motores, herramientas científicas, procesamiento multimedia y bibliotecas son ejemplos habituales.

Apple permite además la interoperabilidad entre Swift y C++, lo que hace posible mantener un motor o biblioteca en C++ y desarrollar en Swift la parte específicamente relacionada con macOS.

C sigue siendo relevante en software de sistemas y APIs POSIX, mientras Objective-C continúa presente en una cantidad considerable de código histórico de macOS.

Metal Shading Language ocupa otro nivel: está destinado a escribir shaders y kernels que se ejecutan sobre la GPU mediante Metal.

Lenguajes como Rust, Go o Zig también pueden producir ejecutables nativos para macOS y Apple Silicon, pero utilizan sus propios toolchains y no tienen el mismo nivel de integración directa con el modelo de desarrollo de Apple.

Herramientas que conviene conocer en macOS

Más allá de clang++, unos pocos comandos permiten diagnosticar gran parte de los problemas relacionados con software nativo.

HerramientaPara qué sirve
clang / clang++Compilar C y C++
xcrunLocalizar herramientas y SDK
lldbDepuración
fileIdentificar arquitectura y formato
otoolExaminar binarios y bibliotecas
lipoConsultar o crear binarios multiarquitectura
codesignConsultar y gestionar firmas
spctlEvaluar software frente a las políticas de macOS

Cuando un proyecto C++ empieza a crecer también tiene sentido utilizar CMake en lugar de mantener manualmente comandos de compilación.

Un ejemplo mínimo:

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)

La compilación puede realizarse con:

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

Este modelo resulta especialmente práctico para proyectos que deben mantenerse simultáneamente en macOS y Linux.

Para un desarrollador que llega desde Linux, por tanto, aprender C++ en macOS no significa empezar de cero. El lenguaje sigue siendo el mismo. Lo que cambia es el entorno que lo rodea: Apple Clang en lugar de un toolchain GNU convencional, libc++, Mach-O, los SDK de Apple y ARM64 como arquitectura dominante.

Entender esas diferencias es suficiente para pasar rápidamente de un pequeño programa compilado desde Terminal a proyectos C++ multiplataforma o herramientas nativas destinadas a administrar una flota de Mac.

Preguntas frecuentes

¿Es necesario instalar Xcode para compilar C++ en macOS?

No. Para muchos proyectos basta con instalar las Command Line Tools mediante xcode-select --install. Xcode completo resulta útil cuando se necesitan el IDE y otras herramientas específicas de desarrollo Apple.

¿Qué compilador utiliza Apple para C++?

Apple utiliza Apple Clang junto con libc++. Forma parte de las herramientas oficiales de desarrollo de macOS.

¿Qué lenguaje es mejor para desarrollar software nativo para Mac?

Swift suele ser la opción principal para nuevas aplicaciones específicamente destinadas a las plataformas Apple. C++ tiene más sentido en motores, bibliotecas, software de alto rendimiento y proyectos que también deben ejecutarse en Linux o Windows.

¿C++ funciona de forma nativa en Apple Silicon?

Sí. Apple Clang puede generar ejecutables ARM64 nativos para los procesadores Apple Silicon y también permite trabajar con otras arquitecturas cuando el SDK y las dependencias lo permiten.

Fuentes:

  • Apple Developer, C++ Language Support.
  • Apple Developer, Command Line Tools y documentación de Xcode.
  • Apple Developer, Swift.
  • Apple Developer, Metal y metal-cpp.
  • LLVM Project, documentación y soporte de C++ en Clang.

encuentra artículos

newsletter

Recibe toda la actualidad del sector tech y cloud en tu email de la mano de RevistaCloud.com.

Suscripción boletín

LO ÚLTIMO