{"id":2668,"date":"2020-05-01T17:22:53","date_gmt":"2020-05-01T14:22:53","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2668"},"modified":"2024-12-16T22:32:28","modified_gmt":"2024-12-16T19:32:28","slug":"linux-to-ios-crosscompile-sdl","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2020\/05\/01\/linux-to-ios-crosscompile-sdl\/","title":{"rendered":"Construindo um aplicativo C++ SDL para iOS no Linux"},"content":{"rendered":"<p>Nesta postagem, descreverei o procedimento para criar 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.< \/p><\/p>\n<p><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 \/><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, em seguida, siga as instru\u00e7\u00f5es no site do Godot Engine para concluir a instala\u00e7\u00e3o:<br \/><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.<\/p>\n<p>Em seguida, voc\u00ea pode come\u00e7ar a criar 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 line-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 line-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 uma 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 line-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 no Xcode no macOS antecipadamente para vincula\u00e7\u00e3o est\u00e1tica; Frameworks copiados do Xcode. A biblioteca libclang_rt.ios.a tamb\u00e9m foi adicionada, que inclui chamadas de tempo de execu\u00e7\u00e3o espec\u00edficas do iOS, por exemplo isOSVersionAtLeast. Uma macro est\u00e1 inclu\u00edda para trabalhar com OpenGL ES, desabilitando fun\u00e7\u00f5es n\u00e3o suportadas na vers\u00e3o m\u00f3vel, semelhante ao Android.<\/p>\n<p>Depois 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.<\/p>\n<p>No macOS, instale o Xcode, cadastre-se no portal da Apple, sem pagar pelo programa de 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 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 compila\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.<\/p>\n<p>Copie 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), depois adicione os recursos necess\u00e1rios ao .app, verifique o 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)<\/p>\n<p>Ap\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 ><br \/><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><br \/>\n<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><br \/>\n<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><br \/>\n<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 postagem, descreverei o procedimento para criar 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.< \/p> 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<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2020\/05\/01\/linux-to-ios-crosscompile-sdl\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Construindo um aplicativo C++ SDL para iOS no Linux&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[124,153,154,77],"class_list":["post-2668","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-c","tag-crosscompile","tag-ios","tag-sdl","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","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},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2668","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=2668"}],"version-history":[{"count":24,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2668\/revisions"}],"predecessor-version":[{"id":3916,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2668\/revisions\/3916"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}