In diesem Beitrag beschreibe ich die Erstellung plattformübergreifender C++-Anwendungen für macOS auf einer Ubuntu-Build-Maschine mit CMake und osxcross.
Installieren Sie zunächst die osxcross-Toolchain:
https://github.com/tpoechtrager/osxcross
Die Installation erfolgt in drei Schritten, wobei Abhängigkeiten heruntergeladen werden:
cd tools
./get_dependencies.sh
Laden Sie XCode.xip von der offiziellen Apple-Website herunter und laden Sie dann das SDK von XCode herunter:
./gen_sdk_package_pbzx.sh /media/demensdeum/2CE62A79E62A4404/LinuxSupportStorage/xcode111.xip
Ich hoffe, Sie haben im letzten Schritt die XCode-Lizenzvereinbarung gelesen? Erstellen Sie als Nächstes die Toolchain mit dem erforderlichen Präfix:
INSTALLPREFIX=/home/demensdeum/Apps/osxcross ./build.sh
Jetzt können Sie osxcross aus dem Präfixverzeichnis des vorherigen Schritts verwenden. Fügen wir ein neues Build-Makro für CMake hinzu und schreiben Sie alles Notwendige:
if (OSXCROSS)
SET(CMAKE_SYSTEM_NAME Darwin)
SET(CMAKE_C_COMPILER o64-clang)
SET(CMAKE_CXX_COMPILER o64-clang++)
SET(CMAKE_C_COMPILER_AR x86_64-apple-darwin19-ar)
SET(CMAKE_CXX_COMPILER_AR x86_64-apple-darwin19-ar)
SET(CMAKE_LINKER x86_64-apple-darwin19-ld)
SET(ENV{OSXCROSS_MP_INC} 1)
endif()
Die dynamische Verknüpfung war bei mir nicht erfolgreich, daher exportieren wir die Bibliotheken statisch:
if (OSXCROSS)
add_library(FlameSteelCore STATIC ${SOURCE_FILES})
else()
Als nächstes werden Sie vielleicht mit der Tatsache konfrontiert, dass Sie nicht über die notwendigen Bibliotheken für osxcross verfügen. Dies ist mir bei der Verwendung von SDL2 aufgefallen. osxcross unterstützt vorgefertigte Bibliothekspakete – Macports. Beispiel: Installation von SDL2-mixer:
osxcross-macports -v install libsdl2_mixer
Danach können Sie wie gewohnt mit dem Erstellen von Bibliotheken/Anwendungen im cmake-make-Link beginnen. Vergessen Sie nicht, bei Bedarf eine statische Verknüpfung von Bibliotheken anzugeben.
Manuelle Zusammenstellung von Bibliotheken
Derzeit bin ich auf das Problem einer fehlerhaften Archivierung von Bibliotheken während der statischen Verknüpfung gestoßen. Beim Erstellen der endgültigen Anwendung erhalte ich die Fehlermeldung:
file was built for archive which is not the architecture being linked (x86_64)
Sehr ähnlich zu diesem Ticket haben wir es geschafft, ein zu implementieren Dies führt zu einer Problemumgehung, die dazu führt, dass die Montage korrekt abgeschlossen wird. Entpacken wir die statische Bibliothek und erstellen sie mit dem osxcross-Archiver neu:
ar x ../libFlameSteelCore.a
rm ../libFlameSteelCore.a
x86_64-apple-darwin19-ar rcs ../libFlameSteelCore.a *.o
Ich persönlich halte auch die mangelnde Möglichkeit, macOS-Anwendungen direkt auf Ubuntu auszuführen (zumindest mit einigen Funktionen), für eines der Probleme. Natürlich gibt es ein Projekt Darling, aber die Unterstützung lässt immer noch zu wünschen übrig.
Quellen
https://github.com/tpoechtrager/osxcross