Construindo aplicativos macOS para Ubuntu OSXCross CMake

Written by

in

Nesta postagem, descreverei a construção de aplicativos C++ multiplataforma para macOS em uma máquina de compilação Ubuntu usando CMake e osxcross.
Primeiro, instale o conjunto de ferramentas osxcross:
https://github.com/tpoechtrager/osxcross
A instalação ocorre em 3 etapas, baixando as dependências:

cd tools
./get_dependencies.sh

Baixe o XCode.xip do site oficial da Apple e, em seguida, baixe o SDK do XCode:

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

Espero que você tenha lido o contrato de licença do XCode na última etapa. A seguir, construa o conjunto de ferramentas com o prefixo necessário:

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

Agora você pode usar osxcross do diretório de prefixos da etapa anterior. Vamos adicionar uma nova macro de construção para o CMake e escrever tudo o que for necessário:

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

A vinculação dinâmica não foi bem-sucedida para mim, então exportamos as bibliotecas estaticamente:

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

Em seguida, você pode se deparar com o fato de não ter as bibliotecas necessárias para osxcross. Encontrei isso ao usar SDL2. osxcross oferece suporte a pacotes de bibliotecas prontos – macports. Por exemplo, instalando o mixer SDL2:

osxcross-macports -v install libsdl2_mixer

Depois disso, você pode começar a construir bibliotecas/aplicativos normalmente no link cmake-make, não se esqueça de especificar a vinculação estática de bibliotecas, se necessário.

Montagem manual de bibliotecas

Atualmente, encontrei o problema de arquivamento incorreto de bibliotecas durante a vinculação estática; ao construir o aplicativo final, recebo o erro:

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

Muito semelhante a este ticket, conseguimos implementar uma solução alternativa que resultou na conclusão correta da compilação. Vamos descompactar a biblioteca estática e construí-la novamente usando o arquivador osxcross:

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

Além disso, um dos problemas que considero pessoalmente é a falta de capacidade de executar aplicativos macOS diretamente no Ubuntu (pelo menos com parte da funcionalidade). Claro, existe um projeto querido, mas o suporte ainda deixa muito a desejar.

Fontes

https://github.com/tpoechtrager/osxcross

Comments

Leave a Reply

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

DemensDeum
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.