Construire la graisse bibliothèque statique (appareil + simulateur) à l'aide de Xcode et le SDK 4+
Il semble que l'on peut - en théorie - construire une bibliothèque statique, qui comprend le simulateur et l'iPhone et l'iPad.
Toutefois, Apple n'a pas de documentation sur ce que je peux trouver, et Xcode modèles par défaut ne sont PAS configurés pour ce faire.
Je suis à la recherche d'un simple, portable, réutilisable technique qui peut être fait à l'intérieur de Xcode.
Un peu d'histoire:
- En 2008, nous avons utilisé pour être en mesure de rendre statique unique-libs qui incluait à la fois la carte sim et le périphérique. Apple désactivé.
- Tout au long de 2009, nous avons fait des paires de bibliothèques statiques - on pour sim, l'une pour l'appareil. Apple a maintenant désactivé aussi.
Références:
-
C'est une excellente idée, c'est une excellente approche, mais il ne fonctionne pas: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Il y a quelques bugs dans son script qui signifie qu'il ne fonctionne que sur sa machine, il doit être à l'aide de BUILT_PRODUCTS_DIR et/ou BUILD_DIR au lieu de "guesstimating" entre eux)
- Les plus récents Xcode ne vous empêche de faire ce qu'il a fait - il aura tout simplement pas de travail, en raison de l' (Documenté) changement dans la façon de Xcode processus cibles)
-
L'autre, de SORTE interlocuteur demandé comment le faire SANS xcode, et avec des réponses qui mettait l'accent sur la arm6 vs arm7 partie - mais pas pour l'architecture i386 partie: Comment puis-je compiler une bibliothèque statique (fat) pour armv6, armv7 et i386
- Depuis Apple dernières modifications, le Simulateur n'est pas le même que le arm6/arm7 différence plus - c'est un problème différent, voir ci-dessus)
- Demandais - pourquoi voudriez-vous que? N'est-il pas l'appareil bibliothèque de plus grand et plus lourd sur l'appareil?
- le "poids" de la bibliothèque n'est pas pertinent dans 95% des situations du monde réel - pour la plupart d'entre nous, les libs sont minuscules, en particulier par rapport à par exemple en affichant même un seul UIImageView.
- pendant ce temps, la valeur est ici que vous faites, il est BEAUCOUP plus facile pour d'autres personnes à l'utiliser/l'utilisation d'une bibliothèque. Il devient une étape de glisser/déposer.
- enfin, un surprenant précieux avantage: il est si facile d'envoyer accidentellement quelqu'un de "mauvais" compilé une bibliothèque - XCode zéro n'contrôles, et sera heureux de compiler les "mauvais" de l'architecture pour le nom de fichier que vous pensiez être la "bonne" architecture. Apple garde la rupture Xcode dans ce domaine, chaque nouvelle version contient des modifications qui signifie "le bouton activé hier pour compiler votre lib correctement aujourd'hui compiler de manière incorrecte". Jusqu'à ce qu'Apple arrête de déconner nous tous autour de nous, nous devons idiot-la preuve de leur mauvaise UI :).
- Adam, donc, essentiellement, le point est de maintenir le même comportement sur simulateur et l'iPhone?
- yep ... avec plusieurs prestations autonomes
- Ce serait vraiment génial! Parce qu'en ce moment tel qu'il est, nous ne pouvons pas compter sur le simulateur pour les tout petit peu plus complexe.
- Veuillez répondre à cette question: lipo augmenter la taille du binaire?
Vous devez vous connecter pour publier un commentaire.
ALTERNATIVES:
Facile de copier/coller de la dernière version (mais les instructions d'installation peut changer - voir ci-dessous!)
Karl bibliothèque de l' prend beaucoup plus d'efforts à l'installation, mais beaucoup plus agréable à long terme de la solution (il convertit votre bibliothèque dans un Cadre).
Utiliser, puis le modifier pour ajouter le support pour les Archives des builds - c.f. @Frederik de commentaire ci-dessous sur les modifications qu'il l'aide pour que cela fonctionne bien avec la mode Archive.
MODIFICATIONS RÉCENTES:
1. Ajout du support pour iOS 10.x (tout en maintenant la prise en charge des anciennes plates-formes)
Info sur comment 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 un couple de show-bouchon de bugs dans Xcode si vous intégrez des projets à l'intérieur les uns des autres, à partir de Xcode 3.x par le biais de Xcode 4.6.x)
Bonus de script pour vous permettre d'auto-inclure les Grappes (c'est à dire inclure les fichiers PNG, fichiers PLIST etc à partir de votre bibliothèque!) - voir ci-dessous (faites défiler vers le bas)
prend désormais en charge iPhone5 (à l'aide d'Apple solution de contournement pour les bugs en lipo). REMARQUE: les instructions d'installation ont changé (je peux probablement simplifier cela en modifiant le script à l'avenir, mais ne veulent pas prendre le risque maintenant)
"copie des en-têtes de section" respecte maintenant le paramètre de construction pour l'emplacement des en-têtes publics (avec l'aimable autorisation de Frederik Wallner)
Ajouté la définition explicite de SYMROOT (peut-être besoin OBJROOT être trop?), merci à Doug Dickinson
SCRIPT (c'est ce que vous avez copier/coller)
Pour l'utilisation /instructions d'installation, voir ci-dessous
INSTRUCTIONS D'INSTALLATION
...BONUS FACULTATIF utilisation:
Si vous ne pouvez pas trouver le fichier de sortie, voici une solution de contournement:
Ajoutez le code suivant à la fin du script (avec l'aimable autorisation de Frederik Wallner): ouvrir "${CREATING_UNIVERSAL_DIR}"
Apple supprime toutes les données de sortie au bout de 200 lignes. Sélectionnez votre Cible, et dans l'Exécution d'un Script Phase, vous DEVEZ décocher la case: "Afficher les variables d'environnement dans le build log"
si vous êtes en utilisant une mesure de construire "sortie" répertoire pour XCode4, puis XCode met tous vos "inattendue" des fichiers dans le mauvais endroit.
...c'est l'emplacement de votre version Universelle.
Comment inclure "non sourcecode" les fichiers dans votre projet (PNG, PLIST, XML, etc)
Script de copie automatique intégré bundle(s) dans le même dossier que votre GRAISSE bibliothèque statique:
-project
à la xcodebuild appel, le nom du projet en cours est en${PROJECT}
(il suffit d'ajouter .xcodeproj à sa fin)."${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}/"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{2\}$)'
CREATING_UNIVERSAL_DIR
à${SYMROOT}/../InstallationBuildProductsLocation${INSTALL_PATH}
et la suppression de larm -rf
etmkdir
appelle juste en dessous de cette ligne. Vous pouvez également activer l'option Exécuter un script uniquement lors de l'installation de sorte que les archives s'appuie tout simplement de créer non gras construit.J'ai passé de nombreuses heures à essayer de construire une grosse bibliothèque statique qui fonctionne sur armv7, armv7s, et le simulateur. Enfin trouvé une solution.
L'essentiel est de construire les deux bibliothèques (l'une pour l'appareil et un pour le simulateur) séparément, de les renommer à distinguer les unes des autres, et puis lipo -créer dans une bibliothèque.
Je l'ai essayé et ça marche!!!
J'ai fait une XCode 4 modèle de projet qui vous permet de créer un cadre universel aussi facilement qu'une bibliothèque.
Il y a un utilitaire de ligne de commande
xcodebuild
et vous pouvez exécuter la commande shell dans xcode.Donc, si vous n'avez pas l'esprit à l'aide personnalisée de script, ce script peut vous aider.
Cherche peut-être inefficace(je ne suis pas bon au script shell), mais facile à comprendre.
J'ai configuré une nouvelle cible exécutant que ce script. Le script est conçu pour la ligne de commande, mais pas testé en 🙂
Le concept de base est
xcodebuild
etlipo
.J'ai essayé plusieurs configurations dans Xcode, INTERFACE utilisateur, mais rien n'a fonctionné. Parce que c'est une sorte de traitement par lots, de la ligne de commande de conception est plus approprié, Apple a donc retiré lot de fonctionnalités de génération de Xcode progressivement. Donc je n'attends pas qu'ils offrent une INTERFACE utilisateur basée lot construire fonctionnalité à l'avenir.
J'avais besoin d'une graisse statique lib pour JsonKit donc créé une lib statique projet dans Xcode, puis a couru ce script bash dans le répertoire du projet. Tant que vous avez configuré le projet xcode avec "Build configuration active uniquement" hors tension, vous devriez obtenir toutes les architectures dans une lib.
IOS 10 mise à Jour:
J'ai eu un problème avec la construction de la fatlib avec iphoneos10.0 parce que l'expression régulière dans le script s'attend seulement 9.x et inférieur et retourne 0.0 pour ios 10.0
pour corriger cela il suffit de remplacer
avec
J'ai décidé d'en faire un Xcode 4 modèle, dans la même veine que Karl cadre statique du modèle.
J'ai trouvé que la construction statique cadres (au lieu de la plaine de bibliothèques statiques) provoquait des plantages aléatoires avec LLVM, en raison d'une apparente de l'éditeur de liens bug - donc, je crois que les bibliothèques statiques sont encore utiles!
Excellent travail! J'ai bidouillé quelque chose de similaire, mais il a dû exécuter séparément. L'avoir fait partie du processus de construction rend les choses beaucoup plus simple.
Un élément de la note. J'ai remarqué qu'il ne copie pas sur tous les fichiers que vous avez marqués comme étant public. J'ai adapté ce que j'avais dans mon script de la vôtre et il fonctionne assez bien. Collez le texte suivant à la fin de votre script.
Fait, je viens de écrit mon propre script à cette fin. Il n'est pas utiliser Xcode.
(Il est basé sur un script similaire dans le Gambit projet de Régime.)
Fondamentalement, il s'exécute ./configurer et de faire trois fois (pour les architectures i386, armv7, et armv7s), et associe chaque résultant des bibliothèques dans une matière grasse lib.