Erstellen von macOS-Anwendungen für Ubuntu OSXCross CMake

Written by

in

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 Phasen, 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? Als nächstes erstellen Sie 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 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 möglicherweise mit der Tatsache konfrontiert, dass Sie nicht über die erforderlichen Bibliotheken für osxcross verfügen. Dies ist mir bei der Verwendung von SDL2 aufgefallen. osxcross unterstützt vorgefertigte Bibliothekspakete – Macports. Beispiel: Installation des SDL2-Mixers:

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 der fehlerhaften Archivierung von Bibliotheken beim statischen Linken 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)

Ganz ähnlich wie bei diesem Ticket ist es uns gelungen, eine Problemumgehung zu implementieren, die dazu führte, dass der Build korrekt abgeschlossen wurde. 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

Eines der Probleme, die ich persönlich sehe, ist außerdem die fehlende Möglichkeit, macOS-Anwendungen direkt auf Ubuntu auszuführen (zumindest mit einem Teil der Funktionalität). Natürlich gibt es ein Projekt Darling, aber die Unterstützung lässt noch zu wünschen übrig.

Quellen

https://github.com/tpoechtrager/osxcross

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *