{"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\/de\/2020\/05\/01\/linux-to-ios-crosscompile-sdl\/","title":{"rendered":"Erstellen einer C++-SDL-Anwendung f\u00fcr iOS unter Linux"},"content":{"rendered":"<p>In diesem Beitrag beschreibe ich das Verfahren zum Erstellen einer C++-SDL-Anwendung f\u00fcr iOS unter Linux, zum Signieren eines IPA-Archivs ohne kostenpflichtiges Apple Developer-Abonnement und zum Installieren auf einem sauberen Ger\u00e4t (iPad) mit macOS ohne 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>Zuerst installieren wir die Build-Toolchain f\u00fcr 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>Die Toolchain muss aus dem Repository heruntergeladen werden. Befolgen Sie dann die Anweisungen auf der Godot Engine-Website, um die Installation abzuschlie\u00dfen:<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>Im Moment m\u00fcssen Sie Xcode dmg herunterladen und das SDK von dort kopieren, um den cctools-Port zu erstellen. Dieser Schritt ist unter macOS einfacher durchzuf\u00fchren; kopieren Sie einfach die erforderlichen SDK-Dateien aus dem installierten Xcode. Nach erfolgreicher Assemblierung enth\u00e4lt das Terminal den Pfad zur Cross-Compiler-Toolchain.<\/p>\n<p>Als n\u00e4chstes k\u00f6nnen Sie mit der Erstellung der SDL-Anwendung f\u00fcr iOS beginnen. \u00d6ffnen wir cmake und f\u00fcgen die notwendigen \u00c4nderungen hinzu, um den C++-Code zu erstellen:<\/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>Jetzt k\u00f6nnen Sie mit cmake und make kompilieren, aber vergessen Sie nicht, $PATH zur Cross-Compiler-Toolchain hinzuzuf\u00fcgen:<\/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>F\u00fcr eine korrekte Verkn\u00fcpfung mit Frameworks und SDL schreiben wir diese in cmake, Abh\u00e4ngigkeiten des Spiels Space Jaguar zum Beispiel:<\/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>In meinem Fall werden die Bibliotheken SDL, SDL_Image und SDL_mixer vorab in Xcode unter macOS f\u00fcr die statische Verkn\u00fcpfung kompiliert; Von Xcode kopierte Frameworks. Au\u00dferdem wurde die Bibliothek libclang_rt.ios.a hinzugef\u00fcgt, die iOS-spezifische Laufzeitaufrufe enth\u00e4lt, beispielsweise isOSVersionAtLeast. F\u00fcr die Arbeit mit OpenGL ES ist ein Makro enthalten, das \u00e4hnlich wie bei Android nicht unterst\u00fctzte Funktionen in der mobilen Version deaktiviert.<\/p>\n<p>Nachdem Sie alle Build-Probleme gel\u00f6st haben, sollten Sie die zusammengestellte Bin\u00e4rdatei f\u00fcr arm erhalten. Betrachten wir als N\u00e4chstes die Ausf\u00fchrung der zusammengestellten Bin\u00e4rdatei auf einem Ger\u00e4t ohne Jailbreak.<\/p>\n<p>Installieren Sie unter macOS Xcode, registrieren Sie sich im Apple-Portal, ohne f\u00fcr das Entwicklerprogramm zu bezahlen. F\u00fcgen Sie ein Konto in Xcode hinzu -&gt; Einstellungen -&gt; Konten, erstellen Sie eine leere Anwendung und bauen Sie auf einem echten Ger\u00e4t auf. W\u00e4hrend der Montage wird das Ger\u00e4t dem kostenlosen Entwicklerkonto hinzugef\u00fcgt. Nach der Zusammenstellung und dem Start m\u00fcssen Sie das Archiv erstellen. W\u00e4hlen Sie dazu \u201eGenerisches iOS-Ger\u00e4t und -Produkt\u201c aus. Archiv. Sobald das Archiv erstellt ist, extrahieren Sie die Dateien \u201eembedded.mobileprovision\u201c und \u201ePkgInfo\u201c daraus. Suchen Sie im Build-Protokoll auf dem Ger\u00e4t die Codesign-Zeile mit dem richtigen Signaturschl\u00fcssel und den Pfad zur Berechtigungsdatei mit der Erweiterung app.xcent und kopieren Sie sie.<\/p>\n<p>Kopieren Sie den .app-Ordner aus dem Archiv, ersetzen Sie die Bin\u00e4rdatei im Archiv durch eine, die von einem Cross-Compiler unter Linux kompiliert wurde (z. B. SpaceJaguar.app\/SpaceJaguar), f\u00fcgen Sie dann die erforderlichen Ressourcen zur .app hinzu und \u00fcberpr\u00fcfen Sie die Integrit\u00e4t der Dateien \u201ePkgInfo\u201c und \u201eembedded.mobileprovision\u201c in der .app aus dem Archiv, ggf. erneut kopieren. Wir signieren die .app erneut mit dem Codesign-Befehl &#8211; Codesign erfordert einen Eingabeschl\u00fcssel f\u00fcr sign, den Pfad zur Berechtigungsdatei (kann mit der Erweiterung .plist umbenannt werden)<\/p>\n<p>Erstellen Sie nach dem erneuten Signieren einen Payload-Ordner, verschieben Sie den Ordner mit der Erweiterung .app dorthin, erstellen Sie ein Zip-Archiv mit Payload im Stammverzeichnis und benennen Sie das Archiv mit der Erweiterung .ipa um. \u00d6ffnen Sie anschlie\u00dfend in Xcode die Ger\u00e4teliste und ziehen Sie das neue ipa per Drag &#038; Drop in die Anwendungsliste des Ger\u00e4ts. Die Installation \u00fcber Apple Configurator 2 funktioniert bei dieser Methode nicht. Wenn die Neusignierung korrekt durchgef\u00fchrt wurde, wird die Anwendung mit der neuen Bin\u00e4rdatei auf einem iOS-Ger\u00e4t (z. B. iPad) mit einem 7-Tage-Zertifikat installiert, das reicht f\u00fcr den Testzeitraum.<\/p>\n<h3>Quellen<\/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>In diesem Beitrag beschreibe ich das Verfahren zum Erstellen einer C++-SDL-Anwendung f\u00fcr iOS unter Linux, zum Signieren eines IPA-Archivs ohne kostenpflichtiges Apple Developer-Abonnement und zum Installieren auf einem sauberen Ger\u00e4t (iPad) mit macOS ohne Jailbreak.< \/p> Zuerst installieren wir die Build-Toolchain f\u00fcr Linux:https:\/\/github.com\/tpoechtrager\/cctools-port Die Toolchain muss aus dem Repository heruntergeladen werden. Befolgen Sie dann die<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2020\/05\/01\/linux-to-ios-crosscompile-sdl\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Erstellen einer C++-SDL-Anwendung f\u00fcr iOS unter 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":"de","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"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}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2668"}],"version-history":[{"count":24,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2668\/revisions"}],"predecessor-version":[{"id":3916,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2668\/revisions\/3916"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}