Création d’applications macOS pour Ubuntu OSXCross CMake

Dans cet article, je décrirai la création d’applications C++ multiplateformes pour macOS sur une machine de build Ubuntu à l’aide de CMake et osxcross.
Tout d’abord, installez la chaîne d’outils osxcross :
https://github.com/tpoechtrager/osxcross
L’installation se déroule en 3 étapes, téléchargement des dépendances :

cd tools
./get_dependencies.sh

Téléchargez XCode.xip depuis le site officiel d’Apple, puis téléchargez le SDK depuis XCode :

./gen_sdk_package_pbzx.sh /media/demensdeum/2CE62A79E62A4404/LinuxSupportStorage/xcode111.xip

J’espère que vous avez lu le contrat de licence XCode lors de la dernière étape ? Ensuite, créez la chaîne d’outils avec le préfixe requis :

INSTALLPREFIX=/home/demensdeum/Apps/osxcross ./build.sh 

Vous pouvez maintenant utiliser osxcross à partir du répertoire de préfixes de l’étape précédente. Ajoutons une nouvelle macro de build pour CMake, écrivons tout ce qui est nécessaire :

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()

La liaison dynamique n’a pas fonctionné pour moi, nous exportons donc les bibliothèques de manière statique :

if (OSXCROSS)
add_library(FlameSteelCore STATIC ${SOURCE_FILES})
else()

Ensuite, vous pourriez être confronté au fait que vous ne disposez pas des bibliothèques nécessaires pour osxcross, j’ai rencontré ce problème lors de l’utilisation de SDL2. osxcross prend en charge les packages de bibliothèques prêts à l’emploi – macports. Par exemple, en installant SDL2-mixer :

osxcross-macports -v install libsdl2_mixer

Après cela, vous pouvez commencer à créer des bibliothèques/applications comme d’habitude dans le lien cmake-make, n’oubliez pas de spécifier des liens statiques de bibliothèques si nécessaire.

Assemblage manuel des bibliothèques

Actuellement, j’ai rencontré le problème d’un archivage incorrect des bibliothèques lors de la liaison statique ; lors de la construction de l’application finale, je reçois l’erreur :

file was built for archive which is not the architecture being linked (x86_64)

Très similaire à ce ticket, nous avons réussi à implémenter un solution de contournement qui permet à l’assemblage de se terminer correctement. Décompressons la bibliothèque statique et recréons-la à l’aide de l’archiveur osxcross :

ar x ../libFlameSteelCore.a
rm ../libFlameSteelCore.a
x86_64-apple-darwin19-ar rcs ../libFlameSteelCore.a *.o

Personnellement, je considère aussi que l’un des problèmes est le manque de possibilité d’exécuter des applications macOS directement sur Ubuntu (au moins avec certaines fonctionnalités). Bien sûr, il existe un projet darling, mais le support laisse encore beaucoup à désirer.

Sources

https://github.com/tpoechtrager/osxcross

Leave a Comment

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