{"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\/fr\/2026\/07\/19\/linux-to-ios-crosscompile-sdl\/","title":{"rendered":"Cr\u00e9ation d&#8217;une application C++ SDL pour iOS sous Linux"},"content":{"rendered":"<p>Dans cette note, je d\u00e9crirai la proc\u00e9dure pour cr\u00e9er une application C++ SDL pour iOS sous Linux, signer une archive ipa sans abonnement Apple Developer payant et l&#8217;installer sur un appareil propre (iPad) utilisant macOS sans 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>Tout d&#8217;abord, installons la cha\u00eene d&#8217;outils de build pour Linux\u00a0:<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>La cha\u00eene d&#8217;outils doit \u00eatre t\u00e9l\u00e9charg\u00e9e depuis le r\u00e9f\u00e9rentiel, puis suivez les instructions sur le site Web Godot Engine pour terminer l&#8217;installation\u00a0:<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>Pour le moment, vous devez t\u00e9l\u00e9charger Xcode dmg et copier le SDK \u00e0 partir de l\u00e0 pour cr\u00e9er le port cctools. Cette \u00e9tape est plus facile \u00e0 r\u00e9aliser sur macOS ; copiez simplement les fichiers SDK n\u00e9cessaires \u00e0 partir du Xcode install\u00e9. Apr\u00e8s un assemblage r\u00e9ussi, le terminal contiendra le chemin d\u2019acc\u00e8s \u00e0 la cha\u00eene d\u2019outils du compilateur crois\u00e9.<br \/>\nEnsuite, vous pouvez commencer \u00e0 cr\u00e9er l&#8217;application SDL pour iOS. Ouvrons cmake et ajoutons les modifications n\u00e9cessaires pour construire le code C++\u00a0:<\/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>Vous pouvez maintenant compiler en utilisant cmake et make, mais n&#8217;oubliez pas d&#8217;ajouter $PATH \u00e0 la cha\u00eene d&#8217;outils du compilateur crois\u00e9\u00a0:<\/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>Pour un lien correct avec les frameworks et SDL, nous les \u00e9crivons dans cmake, d\u00e9pendances du jeu Space Jaguar par exemple :<\/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>Dans mon cas, les biblioth\u00e8ques SDL, SDL_Image, SDL_mixer sont compil\u00e9es \u00e0 l&#8217;avance dans Xcode sur macOS pour les liaisons statiques\u00a0; Frameworks copi\u00e9s depuis Xcode. La biblioth\u00e8que libclang_rt.ios.a a \u00e9galement \u00e9t\u00e9 ajout\u00e9e, qui inclut des appels d&#8217;ex\u00e9cution sp\u00e9cifiques \u00e0 iOS, par exemple isOSVersionAtLeast. Inclus une macro pour travailler avec OpenGL ES, d\u00e9sactivant les fonctions non prises en charge dans la version mobile, similaire \u00e0 Android.<br \/>\nApr\u00e8s avoir r\u00e9solu tous les probl\u00e8mes de construction, vous devriez obtenir le binaire assembl\u00e9 pour arm. Ensuite, envisageons d&#8217;ex\u00e9cuter le binaire assembl\u00e9 sur un appareil sans Jailbreak.<br \/>\nSur macOS, installez Xcode, inscrivez-vous sur le portail Apple, sans payer pour le programme d\u00e9veloppeur. Ajouter un compte dans Xcode -> Pr\u00e9f\u00e9rences -> Comptes, cr\u00e9ez une application vierge et construisez sur un appareil r\u00e9el. Lors de l&#8217;assemblage, l&#8217;appareil sera ajout\u00e9 \u00e0 votre compte d\u00e9veloppeur gratuit. Apr\u00e8s l&#8217;assemblage et le lancement, vous devez cr\u00e9er l&#8217;archive\u00a0; pour ce faire, s\u00e9lectionnez Appareil et produit iOS g\u00e9n\u00e9riques -&gt; Archive. Une fois l\u2019archive cr\u00e9\u00e9e, extrayez-en les fichiersembedded.mobileprovision et PkgInfo. Depuis le journal de build vers l&#8217;appareil, recherchez la ligne de codedesign avec la cl\u00e9 de signature correcte, le chemin d&#8217;acc\u00e8s au fichier de droits avec l&#8217;extension app.xcent, copiez-le.<br \/>\nCopiez le dossier .app de l&#8217;archive, remplacez le binaire dans l&#8217;archive par un autre compil\u00e9 par un compilateur crois\u00e9 sous Linux (par exemple, SpaceJaguar.app\/SpaceJaguar), puis ajoutez les ressources n\u00e9cessaires au .app, v\u00e9rifiez l&#8217;int\u00e9grit\u00e9 des fichiers PkgInfo et Embedded.mobileprovision dans le .app \u00e0 partir de l&#8217;archive, copiez \u00e0 nouveau si n\u00e9cessaire. Nous re-signons le .app \u00e0 l&#8217;aide de la commande codesign &#8211; le codedesign n\u00e9cessite une cl\u00e9 d&#8217;entr\u00e9e pour la signature, le chemin d&#8217;acc\u00e8s au fichier de droits (peut \u00eatre renomm\u00e9 avec une extension .plist)<br \/>\nApr\u00e8s la re-signature, cr\u00e9ez un dossier Payload, d\u00e9placez-y le dossier avec l&#8217;extension .app, cr\u00e9ez une archive zip avec Payload \u00e0 la racine, renommez l&#8217;archive avec l&#8217;extension .ipa. Apr\u00e8s cela, dans Xcode, ouvrez la liste des appareils et faites glisser le nouvel ipa vers la liste des applications de l&#8217;appareil\u00a0; L&#8217;installation via Apple Configurator 2 ne fonctionne pas pour cette m\u00e9thode. Si la re-signature est effectu\u00e9e correctement, alors l&#8217;application avec le nouveau binaire sera install\u00e9e sur un appareil iOS (par exemple, iPad) avec un certificat de 7 jours, cela suffit pour la p\u00e9riode de test.<\/p>\n<h3>Sources<\/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>Dans cette note, je d\u00e9crirai la proc\u00e9dure pour cr\u00e9er une application C++ SDL pour iOS sous Linux, signer une archive ipa sans abonnement Apple Developer payant et l&#8217;installer sur un appareil propre (iPad) utilisant macOS sans Jailbreak. Tout d&#8217;abord, installons la cha\u00eene d&#8217;outils de build pour Linux\u00a0: https:\/\/github.com\/tpoechtrager\/cctools-port La cha\u00eene d&#8217;outils doit \u00eatre t\u00e9l\u00e9charg\u00e9e depuis [&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":"fr","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\/fr\/wp-json\/wp\/v2\/posts\/99","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=99"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/99\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}