Il semble que nous pouvons - théoriquement - construire une bibliothèque statique unique qui comprend à la fois un simulateur et un iPhone et un iPad.
Cependant, Apple ne dispose d'aucune documentation à ce sujet et les modèles par défaut de Xcode ne sont PAS configurés pour ce faire.
Je recherche une technique simple, portable et réutilisable qui peut être effectuée dans Xcode.
Un peu d'histoire:
- En 2008, nous pouvions créer des bibliothèques statiques uniques comprenant à la fois la carte SIM et l'appareil. Apple l'a désactivé.
- Tout au long de 2009, nous avons créé des paires de bibliothèques statiques - une pour la simulation, une pour le périphérique. Apple a désormais désactivé cela également.
Références:
C'est une excellente idée, c'est une excellente approche, mais cela ne fonctionne pas: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Il y a quelques bogues dans son script qui signifient que cela ne fonctionne que sur sa machine - il devrait utiliser BUILT_PRODUCTS_DIR et / ou BUILD_DIR au lieu de les "évaluer".)
- Le dernier Xcode d'Apple vous empêche de faire ce qu'il a fait - cela ne fonctionnera tout simplement pas, en raison du changement (documenté) dans la façon dont Xcode traite les cibles)
Un autre intervenant SO a demandé comment le faire SANS xcode et avec des réponses axées sur la partie arm6 vs arm7 - mais a ignoré la partie i386: comment compiler une bibliothèque statique (fat) pour armv6, armv7 et i386
- Depuis les derniers changements d'Apple, la partie Simulator n'est plus la même chose que la différence arm6 / arm7 - c'est un problème différent, voir ci-dessus)
Réponses:
ALTERNATIVES:
Copier / coller facile de la dernière version (mais les instructions d'installation peuvent changer - voir ci-dessous!)
La bibliothèque de Karl prend beaucoup plus d'efforts à configurer, mais une solution à long terme beaucoup plus agréable (elle convertit votre bibliothèque en un Framework).
Utilisez-le, puis ajustez-le pour ajouter la prise en charge des versions d'archives - voir le commentaire de @ @ Frederik ci-dessous sur les modifications qu'il utilise pour que cela fonctionne correctement avec le mode Archive.
MODIFICATIONS RÉCENTES: 1. Ajout de la prise en charge d'iOS 10.x (tout en maintenant la prise en charge des anciennes plates-formes)
Informations sur la façon d'utiliser ce script avec un projet intégré dans un autre projet (bien que je recommande fortement de ne PAS le faire, jamais - Apple a quelques bogues de blocage dans Xcode si vous intégrez des projets les uns dans les autres, à partir de Xcode 3.x à Xcode 4.6.x)
Script bonus pour vous permettre d'inclure automatiquement des bundles (c'est-à-dire inclure des fichiers PNG, des fichiers PLIST, etc. de votre bibliothèque!) - voir ci-dessous (faites défiler vers le bas)
prend désormais en charge iPhone5 (en utilisant la solution de contournement d'Apple pour les bogues dans lipo). REMARQUE: les instructions d'installation ont changé (je peux probablement simplifier cela en changeant le script à l'avenir, mais je ne veux pas le risquer maintenant)
La section "copier les en-têtes" respecte désormais le paramètre de construction pour l'emplacement des en-têtes publics (avec l'aimable autorisation de Frederik Wallner)
Ajout du paramètre explicite de SYMROOT (peut-être que OBJROOT doit également être défini?), Grâce à Doug Dickinson
SCRIPT (c'est ce que vous devez copier / coller)
Pour les instructions d'utilisation / d'installation, voir ci-dessous
INSTALLER LES INSTRUCTIONS
... BONUS OPTIONAL utilisation:
Si vous ne trouvez pas le fichier de sortie, voici une solution:
Ajoutez le code suivant à la fin du script (avec la permission de Frederik Wallner): ouvrez "$ {CREATING_UNIVERSAL_DIR}"
Apple supprime toutes les sorties après 200 lignes. Sélectionnez votre cible et dans la phase d'exécution du script, vous DEVEZ décocher: "Afficher les variables d'environnement dans le journal de génération"
si vous utilisez un répertoire "build output" personnalisé pour XCode4, alors XCode place tous vos fichiers "inattendus" au mauvais endroit.
... c'est l'emplacement de votre Universal Build.
Comment inclure des fichiers "non sourcecode" dans votre projet (PNG, PLIST, XML, etc.)
Script pour copier automatiquement le ou les bundles intégrés dans le même dossier que votre bibliothèque statique FAT:
la source
J'ai passé de nombreuses heures à essayer de construire une grosse bibliothèque statique qui fonctionnera sur armv7, armv7s et le simulateur. Enfin trouvé une solution .
L'essentiel est de construire les deux bibliothèques (une pour le périphérique et une pour le simulateur) séparément, de les renommer pour les distinguer l'une de l'autre, puis de les lipo-créer dans une bibliothèque.
Je l'ai essayé et il fonctionne!
la source
J'ai créé un modèle de projet XCode 4 qui vous permet de créer un cadre universel aussi facilement que de créer une bibliothèque régulière.
la source
Il existe un utilitaire de ligne de commande
xcodebuild
et vous pouvez exécuter la commande shell dans xcode. Donc, si cela ne vous dérange pas d'utiliser un script personnalisé, ce script peut vous aider.Peut-être semble inefficace (je ne suis pas bon en script shell), mais facile à comprendre. J'ai configuré une nouvelle cible exécutant uniquement ce script. Le script est conçu pour la ligne de commande mais n'est pas testé dans :)
Le concept de base est
xcodebuild
etlipo
.J'ai essayé de nombreuses configurations dans l'interface utilisateur de Xcode, mais rien n'a fonctionné. Comme il s'agit d'une sorte de traitement par lots, la conception en ligne de commande est plus adaptée, donc Apple a progressivement supprimé la fonctionnalité de génération par lots de Xcode. Je ne m'attends donc pas à ce qu'ils proposent à l'avenir une fonctionnalité de génération de lots basée sur l'interface utilisateur.
la source
J'avais besoin d'une grosse bibliothèque statique pour JsonKit, j'ai donc créé un projet de bibliothèque statique dans Xcode, puis j'ai exécuté ce script bash dans le répertoire du projet. Tant que vous avez configuré le projet xcode avec "Build active configuration only" désactivé, vous devriez obtenir toutes les architectures dans une seule lib.
la source
Mise à jour IOS 10:
J'ai eu un problème avec la construction de la fatlib avec iphoneos10.0 car l'expression régulière dans le script n'attend que 9.x et moins et retourne 0.0 pour ios 10.0
pour résoudre ce problème, il suffit de remplacer
avec
la source
J'ai transformé cela en un modèle Xcode 4 , dans la même veine que le modèle de cadre statique de Karl.
J'ai trouvé que la construction de frameworks statiques (au lieu de bibliothèques statiques simples) provoquait des plantages aléatoires avec LLVM, en raison d'un bug apparent de l'éditeur de liens - donc, je suppose que les bibliothèques statiques sont toujours utiles!
la source
Bon travail! J'ai piraté ensemble quelque chose de similaire, mais j'ai dû l'exécuter séparément. Le faire simplement partie du processus de construction le rend tellement plus simple.
Un élément à noter. J'ai remarqué qu'il ne copie aucun des fichiers d'inclusion que vous marquez comme publics. J'ai adapté ce que j'avais dans mon script au vôtre et cela fonctionne assez bien. Collez ce qui suit à la fin de votre script.
la source
En fait, je viens d' écrire mon propre script à cet effet. Il n'utilise pas Xcode. (Il est basé sur un script similaire dans le projet Gambit Scheme.)
Fondamentalement, il exécute ./configure et fait trois fois (pour i386, armv7 et armv7s), et combine chacune des bibliothèques résultantes dans une librairie grasse.
la source