Privé de module de carte pour un cadre
Je suis en utilisant cette réponse pour créer un module de carte de créer un module pour CommonCrypto donc je peux l'utiliser dans un cadre.
Faire ceci, cependant, signifie que tous les projets que j'utilise ce cadre pour avoir accès à CommonCrypto avec import CommonCrypto
- et pire encore, en déclarant CommonCrypto dans un autre cadre et de l'importation dans les résultats du projet dans Redefinition of module 'CommonCrypto'
erreurs.
I. e. la configuration suivante:
MainProject
|--> import FrameworkA - module map for CommonCrypto
|--> import FrameworkB - module map for CommonCrypto
Est-il un moyen de créer un module de carte, mais l'avoir privé de ce Cadre de ses créé/utilisé? (Un peu comme le internal
accéder à un attribut dans Swift pour un Cadre).
Le llvm Clang docs montrer un privé
l'attribut mais je ne peux pas savoir où mettre cela dans mon module de carte, et il peut même n'être pas à cette fin!
Il y a aussi un export
l'attribut mais encore une fois je ne suis pas entièrement sûr de savoir comment utiliser ce...!
C'est ma carte module que j'utilise pour CommonCrypto - le $(SDKROOT)
obtient échangé dans une phase de construction à l'emplacement correct (pour iphoneos
ou iphonesimulator
Sdk):
module CommonCrypto [system] [extern_c] {
umbrella header "$(SDKROOT)/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
Cela fonctionne très bien (sauf que vous ne pouvez pas "aller à la définition de" mais je ne me dérange pas) pour une utilisation dans FrameworkA
/FrameworkB
.
Riche, pourriez-vous s'il vous plaît fournir votre phase de génération de script qui remplace $(SKROOT)? Merci!
Le Script est ici: gist.github.com/rhodgkins/5eecee8bcbdb6021fc798247132e9fa7 et puis de le configurer comme ceci: postimg.org/image/fj7j9nsqp dans un projet. N'oubliez pas d'ajouter le répertoire $(PROJECT_DIR)/$(TARGET_NAME)/ExternalFrameworks/ * - Cadre de Recherche de Chemins de construire. Alors toutes les cartes de modules doit s'asseoir dans le répertoire d'entrée de dossier avec le nom du dossier contenant le modulemap étant le nom.
OriginalL'auteur Rich | 2015-12-14
Vous devez vous connecter pour publier un commentaire.
Avertissement: je n'ai pas essayé ce pour
CommonCrypto
mais il fonctionne pour mon cas aveclibz
Une solution possible à ce problème est de créer un
module.private.modulemap
comme décrit dans la Clang documentationAinsi, par exemple dans FrameworkA vous pouvez écrire un
module.modulemap
fichier pour FrameworkA comme suit:Ensuite, vous créez un
module.private.modulemap
fichier commePuis répétez l'opération pour FrameworkB.
Maintenant CommonCrypto est une private module dans les deux FrameworkA et FrameworkB et les noms ne sera pas en conflit.
Je reçois beaucoup de l'utilisation de non déclarées de type ...'. Avez-vous fait face ?
Vous avez probablement non déclarées de type parce que votre module n'est pas l'exportation de tous les en-têtes. Le
export *
permettra d'exporter les en-têtes deFrameworkACommon
et à l'importation, vous devez écrireFrameworkACommon.Crypto
mais ça s'arrêtera là. Exporté en-têtes ne seront pas visibles passé FrameworkACommon, ils sont à l'intérieur maintenant.Est-il possible d'obtenir ce genre de chose fonctionne à l'aide de CocoaPods? J'ai essayé un certain nombre de choses avec modulemaps, mais je n'arrive pas à le faire fonctionner
Vous pouvez spécifier un module de carte pour un CocoaPod spec.
OriginalL'auteur tmpz