Vorsicht
Wenn Sie dies für einen Produktionsnutzungsfall verwenden, sollten Sie dieses Projekt aufnehmen und das Bild selbst erstellen
Mit diesem Projekt können Sie den Code unter Linux überschreiten, der auf macOS ausgeführt wird. Dies kann sehr nützlich für CI -Umgebungen sein, in denen Sie für macOS erstellen möchten, aber Sie möchten nicht die Mühe (und Kosten) der Einrichtung einer MacOS -Umgebung durchführen.
Es unterstützt:
Die Unterstützung für objektive C und objektives C ++ funktioniert möglicherweise außerhalb des Boxs, dies wird jedoch nicht getestet.
Notiz
Dieses Projekt konzentriert sich auf die Unterstützung neuerer Versionen von MacOS und C, C ++, Forran und Rost. Versionen älter als macOS 13 (Ventura) sind nicht gut getestet, obwohl sie gut funktionieren sollten .
MacOS -Systembibliotheken und Header werden mit dem Docker -Bild versehen. Dies sollte zum Zusammenstellen von eigenständigen MacOS -Programmen und möglicherweise nativen MacOS -Anwendungen geeignet sein.
Die Cross-Compiler sind als Docker-Image erhältlich. Dies ist am einfachsten, um das Projekt zu verteilen, da es so viele Host -Abhängigkeiten gibt. Wenn Sie daran interessiert sind, dies ohne Docker zu verwenden, sollten Sie sich Osxcross ansehen, das die Basis dieses Projekts bildet.
Das Docker-Bild ist unter ghcr.io/Shepherdjerred/macos-cross-compiler verfügbar.
Installieren Sie die folgenden Anforderungen und befolgen Sie die Anweisungen im Nutzungsabschnitt.
Wichtig
Das Docker -Bild ist ziemlich groß. Es enthält mehrere Compiler und das MacOS SDK.
# Start a Docker container using the Docker image.
# Replace `$PWD/samples` with the path to the source you want to compile.
$ docker run --platform=linux/amd64
-v $PWD /samples:/workspace
--rm
-it
ghcr.io/shepherdjerred/macos-cross-compiler:latest
/bin/bash
# Now that you're inside of the Docker container, you can run the compilers.
# Compile using gcc
# # targeting darwin arm64
$ aarch64-apple-darwin24-gcc hello.c -o hello
$ aarch64-apple-darwin24-g++ hello.cpp -o hello
# # targeting darwin x86_64
$ x86_64-apple-darwin24-gcc hello.c -o hello
$ x86_64-apple-darwin24-g++ hello.cpp -o hello
# Compile using clang
# # for darwin arm64
$ aarch64-apple-darwin24-clang --target=aarch64-apple-darwin24 hello.c -o hello
$ aarch64-apple-darwin24-clang++ --target=aarch64-apple-darwin24 hello.cpp -o hello
# # for darwin x86_64
$ x86_64-apple-darwin24-clang --target=x86_64-apple-darwin24 hello.c -o hello
$ x86_64-apple-darwin24-clang++ --target=x86_64-apple-darwin24 hello.cpp -o hello
# Compile using gfortran
# # for darwin arm64
$ aarch64-apple-darwin24-gfortran hello.f90 -o hello
# # for darwin x86_64
$ x86_64-apple-darwin24-gfortran hello.f90 -o hello
# Compile using Zig
# # C targeting darwin arm64 (change aarch64 -> x86_64 to target amd64)
$ zig cc
-target aarch64-macos
--sysroot=/sdk
-I/sdk/usr/include
-L/sdk/usr/lib
-F/sdk/System/Library/Frameworks
-framework CoreFoundation
-o hello hello.c
# # Rust targeting darwin arm64 (change aarch64 -> x86_64 to target amd64)
$ export CC=zig-cc-aarch64-macos
$ cd rust && cargo build --target aarch64-apple-darwinDie Unterstützung für Rost erfordert ein wenig Projektkonfiguration.
# .cargo/config.toml
[ build ]
[ target . aarch64-apple-darwin ]
linker = " zig-cc-aarch64-macos "
[ target . x86_64-apple-darwin ]
linker = " zig-cc-x86_64-macos " Nach der Konfiguration können Sie cargo ausführen, nachdem Sie die CC -Variable festgelegt haben:
export CC= " zig-cc-x86_64-macos "
cargo build --target x86_64-apple-darwin
export CC= " zig-cc-aarch64-macos "
cargo build --target aarch64-apple-darwinDie folgende Tabelle zeigt den Namen der ausführbaren Datei für jedes Architektur-/Compiler -Paar.
Notiz
Die Target -Kernel -Version ist darwin24 . Sie müssen ein neues Docker -Bild erstellen, wenn Sie eine andere Kernel -Version unterstützen möchten.
| aarch64 | |
|---|---|
| Klang | aArch64-apple-darwin24-Clang |
| Klang ++ | aArch64-apple-darwin24-Clang ++ |
| GCC | AARCH64-APPLE-DARWIN24-GCC |
| G ++ | aArch64-apple-darwin24-g ++ |
| GFORTRAN | aArch64-apple-darwin24-gfortran |
Die relevanten Compiler befinden sich an /osxcross/bin und /gcc/bin . Beide Verzeichnisse befinden sich bereits im Docker -Container auf dem PATH .
Dieses Projekt erstellt CCTools, die Apples Version von Binutils. Diese Programme sind Versorgungsunternehmen mit niedrigem Niveau, die von Compilern wie dem Archiver ar , dem Lader ld und dem Assembler as verwendet werden.
Sie müssen diese Programme wahrscheinlich nicht direkt ausführen, aber wenn Sie dies tun, befinden sie sich in /cctools/bin und sind auch auf dem PATH .
Komplette Werkzeugliste:
Mit diesem Projekt sollten Code -Unterzeichnung (aber nicht notariell) möglich sein, aber es ist nicht getestet. Das Aufbau von universellen Binärdateien sollte ebenfalls möglich sein, aber dies wird auch nicht getestet.
Das rcodesign wurde empfohlen, um Binärdateien für macOS zu unterzeichnen und zu notarisieren.
Dieses Projekt kann für macOS sowohl auf X86_64 als auch auf ACARCH64 -Archtictures erstellen, unabhängig von der Host -Architektur.
| Linux x86_64 | Linux Arm64 | |
|---|---|---|
| macOS x86_64 | ✅ | ✅ |
| macos aarch64 | ✅ | ✅ |
Notiz
AARCH64 ist Apples interner Name für ARM64. Sie werden austauschbar verwendet, aber AARG64 ist korrekter, wenn sie sich auf macOS auf ARM64 beziehen.
Dieses Projekt unterstützt die folgenden Sprachen:
Dieses Projekt unterstützt die folgenden Versionen von macOS:
Die Unterstützung für macOS 15 Seqouia wurde nicht ausgiebig getestet. Das Docker -Bild verwendet standardmäßig die 15.0 SDK.
Wichtig
Dieses Projekt wird an modernen Verisonen von Macos, Clang und GCC getestet. Es wurde nicht mit älteren Versionen dieser Software getestet. Wenn Sie mit älteren Versionen zusammengefasst werden müssen, lesen Sie das OSXCross -Projekt.
Dieses Docker-Bild bündelt den Xcode SDK von Joseluisq/macOSX-SDKS. Bitte machen Sie sich mit den Nutzungsbedingungen des SDK vertraut.
Dieses Repository ist im Wesentlichen ein Wrapper um die folgenden Projekte:
Diese Ressourcen waren hilfreich bei der Arbeit an diesem Projekt:
Der Zick- und Rost -Teil wurde durch diese Ressourcen informiert:
Die Docker -Bilder für dieses Repository sind mit irdisch erstellt.
Tipp
Der Bau von GCC ist berechnet und intensiv. Sie können die Anzahl der parallelen Aufgaben anpassen, indem Sie ein Argument --cores=<number> an einen beliebigen Befehl, z. B. earthly +image --cores=4 , übergeben. Nach meiner Erfahrung brauchen Sie viel Speicher, wenn Sie alle Ihre Kerne verwenden möchten. Ich hatte Erfolg, indem ich diesen Wert auf etwa die halbe Kerne wie meine CPU gesetzt habe. Sie sollten den Wert senken, wenn Ihre Maschine abbindet.
# Create a Docker image tagged as `shepherdjerred/macos-cross-compiler`
# The first run will take ~20 minutes on an M1 MacBook.
# Subsequent runs are faster.
earthly +image
# Verify that the compilers work correctly
earthly +test
# If you're on macOS, try actually running the binaries
earthly +validateDieses Projekt wäre ohne das Osxcross -Projekt nicht möglich gewesen.