Neste post, descreverei a criaçã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. Em seguida, 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 build para o CMake, escreva 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 o osxcross. Encontrei isso ao usar o 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 e recebo o erro:
;
file was built for archive which is not the architecture being linked (x86_64)
Muito semelhante a este ticket, conseguimos implementar um solução alternativa como resultado, o que resulta na conclusão correta da montagem. 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
Eu também considero pessoalmente que um dos problemas é a falta de capacidade de executar aplicativos macOS diretamente no Ubuntu (pelo menos com algumas funcionalidades), é claro que existe um projeto querido, mas o suporte ainda deixa muito a desejar.
Fontes
https://github.com/tpoechtrager/osxcross