{"id":99,"date":"2026-07-19T16:39:12","date_gmt":"2026-07-19T16:39:12","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/07\/19\/linux-to-ios-crosscompile-sdl\/"},"modified":"2026-07-19T16:39:12","modified_gmt":"2026-07-19T16:39:12","slug":"linux-to-ios-crosscompile-sdl","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2026\/07\/19\/linux-to-ios-crosscompile-sdl\/","title":{"rendered":"Construindo um aplicativo C++ SDL para iOS no Linux"},"content":{"rendered":"<p>Nesta nota, descreverei o procedimento para construir um aplicativo C++ SDL para iOS no Linux, assinar um arquivo ipa sem uma assinatura paga do Apple Developer e instal\u00e1-lo em um dispositivo limpo (iPad) usando macOS sem Jailbreak.<br \/>\n<iframe loading=\"lazy\" title=\"1984 Apple&#039;s Macintosh Commercial (HD)\" width=\"620\" height=\"465\" src=\"https:\/\/www.youtube.com\/embed\/VtvjbmoDx-I?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>Primeiro, vamos instalar o conjunto de ferramentas de compila\u00e7\u00e3o para Linux:<br \/>\n<a href=\"https:\/\/github.com\/tpoechtrager\/cctools-port\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/tpoechtrager\/cctools-port<\/a><\/p>\n<p>O conjunto de ferramentas precisa ser baixado do reposit\u00f3rio e siga as instru\u00e7\u00f5es no site do Godot Engine para concluir a instala\u00e7\u00e3o:<br \/>\n<a href=\"https:\/\/docs.godotengine.org\/ru\/latest\/development\/compiling\/cross-compiling_for_ios_on_linux.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.godotengine.org\/ru\/latest\/development\/compiling\/cross-compiling_for_ios_on_linux.html<\/a><\/p>\n<p>No momento, voc\u00ea precisa baixar o Xcode dmg e copiar o SDK de l\u00e1 para construir o cctools-port. Esta etapa \u00e9 mais f\u00e1cil de concluir no macOS; basta copiar os arquivos SDK necess\u00e1rios do Xcode instalado. Ap\u00f3s a montagem bem-sucedida, o terminal conter\u00e1 o caminho para o conjunto de ferramentas do compilador cruzado.<br \/>\nA seguir, voc\u00ea pode come\u00e7ar a construir o aplicativo SDL para iOS. Vamos abrir o cmake e adicionar as altera\u00e7\u00f5es necess\u00e1rias para construir o c\u00f3digo C++:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>SET(CMAKE_SYSTEM_NAME Darwin)\nSET(CMAKE_C_COMPILER arm-apple-darwin11-clang)\nSET(CMAKE_CXX_COMPILER arm-apple-darwin11-clang++)\nSET(CMAKE_LINKER arm-apple-darwin11-ld)\n\n<\/code><\/pre>\n<\/div>\n<p>Agora voc\u00ea pode compilar usando cmake e make, mas n\u00e3o se esque\u00e7a de adicionar $PATH ao conjunto de ferramentas do compilador cruzado:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\nPATH=$PATH:~\/Sources\/cctools-port\/usage_examples\/ios_toolchain\/target\/bin\n\n<\/code><\/pre>\n<\/div>\n<p>Para correta vincula\u00e7\u00e3o com frameworks e SDL, escrevemos eles em cmake, depend\u00eancias do jogo Space Jaguar por exemplo:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\ntarget_link_libraries(\n${FSEGT_PROJECT_NAME}\n${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/libclang_rt.ios.a\n${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/libSDL2.a\n${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/libSDL2_mixer.a\n${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/libSDL2_image.a\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/CoreServices.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/ImageIO.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/Metal.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/AVFoundation.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/GameController.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/CoreMotion.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/CoreGraphics.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/AudioToolbox.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/CoreAudio.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/QuartzCore.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/OpenGLES.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/UIKit.framework\"\n\"${FLAME_STEEL_PROJECT_ROOT_DIRECTORY}\/scripts\/buildScripts\/ios\/resources\/libs\/Foundation.framework\"\n)\n\n<\/code><\/pre>\n<\/div>\n<p>No meu caso, as bibliotecas SDL, SDL_Image, SDL_mixer s\u00e3o compiladas antecipadamente no Xcode no macOS para vincula\u00e7\u00e3o est\u00e1tica; Frameworks copiados do Xcode. Tamb\u00e9m foi adicionada a biblioteca libclang_rt.ios.a, que inclui chamadas de tempo de execu\u00e7\u00e3o espec\u00edficas do iOS, por exemplo isOSVersionAtLeast. Inclu\u00edda macro para trabalhar com OpenGL ES, desabilitando fun\u00e7\u00f5es n\u00e3o suportadas na vers\u00e3o mobile, semelhante ao Android.<br \/>\nDepois de resolver todos os problemas de constru\u00e7\u00e3o, voc\u00ea dever\u00e1 obter o bin\u00e1rio montado para arm. A seguir, vamos considerar a execu\u00e7\u00e3o do bin\u00e1rio montado em um dispositivo sem Jailbreak.<br \/>\nNo macOS, instale o Xcode, cadastre-se no portal da Apple, sem pagar pelo programa do desenvolvedor. Adicione uma conta no Xcode -> Prefer\u00eancias -&gt; Contas, crie um aplicativo em branco e construa em um dispositivo real. Durante a montagem, o dispositivo ser\u00e1 adicionado \u00e0 sua conta de desenvolvedor gratuita. Ap\u00f3s a montagem e lan\u00e7amento, voc\u00ea precisa construir o arquivo; para fazer isso, selecione Dispositivo e produto iOS gen\u00e9rico -&gt; Arquivo. Depois que o arquivo for compilado, extraia os arquivos incorporados.mobileprovision e PkgInfo dele. No log de constru\u00e7\u00e3o do dispositivo, encontre a linha de codesign com a chave de assinatura correta, o caminho para o arquivo de direitos com a extens\u00e3o app.xcent e copie-o.<br \/>\nCopie a pasta .app do arquivo, substitua o bin\u00e1rio no arquivo por um compilado por um compilador cruzado no Linux (por exemplo, SpaceJaguar.app\/SpaceJaguar) e, em seguida, adicione os recursos necess\u00e1rios ao .app, verifique a integridade dos arquivos PkgInfo e incorporado.mobileprovision no .app do arquivo, copie novamente se necess\u00e1rio. Assinamos novamente o .app usando o comando codesign &#8211; codesign requer uma chave de entrada para assinar, o caminho para o arquivo de direitos (pode ser renomeado com uma extens\u00e3o .plist)<br \/>\nAp\u00f3s assinar novamente, crie uma pasta Payload, mova a pasta com a extens\u00e3o .app para l\u00e1, crie um arquivo zip com Payload na raiz, renomeie o arquivo com a extens\u00e3o .ipa. Depois disso, no Xcode, abra a lista de dispositivos e arraste e solte o novo ipa na lista de aplicativos do dispositivo; A instala\u00e7\u00e3o via Apple Configurator 2 n\u00e3o funciona para este m\u00e9todo. Se a nova assinatura for feita corretamente, o aplicativo com o novo bin\u00e1rio ser\u00e1 instalado em um dispositivo iOS (por exemplo, iPad) com certificado de 7 dias, o que \u00e9 suficiente para o per\u00edodo de teste.<\/p>\n<h3>Fontes<\/h3>\n<p><a href=\"https:\/\/github.com\/tpoechtrager\/cctools-port\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/tpoechtrager\/cctools-port<\/a><\/p>\n<p><a href=\"https:\/\/docs.godotengine.org\/ru\/latest\/development\/compiling\/cross-compiling_for_ios_on_linux.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.godotengine.org\/ru\/latest\/development\/compiling\/cross-compiling_for_ios_on_linux.html<\/a><\/p>\n<p><a href=\"https:\/\/jonnyzzz.com\/blog\/2018\/06\/13\/link-error-3\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/jonnyzzz.com\/blog\/2018\/06\/13\/link-error-3\/<\/a><\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/6896029\/re-sign-ipa-iphone\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/stackoverflow.com\/questions\/6896029\/re-sign-ipa-iphone<\/a><\/p>\n<p><a href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/Security\/Conceptual\/CodeSigningGuide\/Procedures\/Procedures.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developer.apple.com\/library\/archive\/documentation\/Security\/Conceptual\/CodeSigningGuide\/Procedures\/Procedures.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesta nota, descreverei o procedimento para construir um aplicativo C++ SDL para iOS no Linux, assinar um arquivo ipa sem uma assinatura paga do Apple Developer e instal\u00e1-lo em um dispositivo limpo (iPad) usando macOS sem Jailbreak. Primeiro, vamos instalar o conjunto de ferramentas de compila\u00e7\u00e3o para Linux: https:\/\/github.com\/tpoechtrager\/cctools-port O conjunto de ferramentas precisa ser [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-99","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.3","language":"pt","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":false,"content":false,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/99","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=99"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/99\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}