Dans un cadre personnalisé contenant à la fois le code Objective-C et Swift, le compilateur Swift lève l'erreur suivante:
[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
umbrella header "bugtest.h"
^
<unknown>:0: error: could not build Objective-C module 'bugtest'
Cela se produira lorsque le paramètre Always Search User Paths
sera activé pour la cible Framework.
Le régler sur No
résoudra cette erreur.
IMHO c'est un bug dans le compilateur Swift et j'ai déposé un radar avec Apple.
Voir rdar: // 2103844
Dans XCode 7 Beta, avec Swift2, cela se produira également si votre en-tête de cadre n'est pas déclaré comme "public".
Par exemple, j'avais un cadre Cocoa Touch Framework avec une visibilité "Projet" pour le fichier d'en-tête et l'erreur "En-tête de parapluie ... introuvable" pour tous les fichiers Swift de mon projet, une fois le en-tête "Public", l'erreur est partie
Cela peut se produire de 4 manières différentes, en ignorant les bugs des versions précédentes de Xcode.
DEFINES_MODULE
n'est pas défini sur YES
CLANG_ENABLE_MODULES
n'est pas défini sur YES
Pour moi, le niveau d’accès était public, mais il n’a pas non plus été trouvé. J'ai déplacé la section "Headers" de "Build phases" vers le haut et cela a commencé à fonctionner. Script pour podfile:
post_install do |installer|
installer.pods_project.targets.each do |target|
phase_name = 'Headers'
target.build_phases.each do |phase|
if (phase.display_name.include? phase_name)
target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
end
end
end
Ne pas savoir pourquoi cela se passe. Essayé sur des projets factices - ne pas se produire. Seulement sur les grands avec plusieurs dépendances. Quelque chose avec la compilation AVANT de copier les en-têtes de parapluie.
Une autre solution: après avoir renommé un dossier, l'ancien emplacement peut toujours être répertorié dans le fichier de projet pour le fichier .h, même si vous avez mis à jour l'emplacement via la barre latérale de Xcode. Cet ancien emplacement provoque l'erreur d'en-tête de parapluie.
Solution simple: supprimez la référence au fichier .h et rajoutez-le. (et n'oubliez pas de le rendre à nouveau public!)
Pour moi, régler "Utiliser les cartes d'en-tête" sur "NON" a résolu le problème.
Il y a déjà d'excellentes réponses ici. @ Shadow_x99 était très utile. Cependant, si je pouvais être autorisé à compléter avec ma propre expérience.
Un en-tête de parapluie est identifié automatiquement dans le processus de construction. Ce n'est pas spécifié dans les paramètres de construction de la cible ni hérité des paramètres du projet.
Donc pour éviter cette erreur que - à partir de XCode 7 - est comme suit;
warning: no umbrella header found for target 'MyTarget', module map will not be generated
deux mesures importantes doivent être prises.
Premièrement, l'en-tête d'un parapluie doit avoir le même nom que la cible. Donc, si votre cible est un framework nommé MyTarget
, il doit y avoir un en-tête nommé MyTarget.h
.
Deuxièmement, dans les phases de construction de MyTarget
- comme indiqué dans cette réponse - ce fichier d’en-tête doit être répertorié dans la section section publique, comme indiqué ci-dessus.
J'ai constaté qu'avec les nouveaux systèmes de construction Swift Build et Parallelize Build activés, des erreurs se produiraient comme dans cette question. La solution consistait à établir une liaison avec les frameworks importés dans les fichiers source Swift. (Je pense que précédemment, l'application se construirait parce qu'il est juste arrivé que les frameworks soient liés à quelque chose construit précédemment dans la file d'attente de construction en série).
J'ai écrit un script pour passer en revue toutes les importations dans toutes les cibles d'un espace de travail et m'assurer que leurs cadres ont été liés à cette cible.
J'ai eu le même problème et aucune des réponses suggérées n'a aidé dans mon cas, donc je laisse ceci ici au cas où quelqu'un aurait le même problème.
J'avais ajouté un "script d'exécution" dans "phases de construction", mais j'ai fini par le supprimer et c'est à ce moment-là que j'ai commencé à obtenir l'erreur.
Ma solution a fini par devoir nettoyer le projet, reconstruire mon framework, puis mon projet d'application construit correctement.
Supprimez ces fichiers du répertoire du projet. .xcworkspace
pods/
et podfile.lock
mettre à jour le pod et construire le projet.
Je l'ai corrigé en rendant le mode de compilation des paramètres de construction du cadre problématique en incrémental.
Je peux cas cas problème a été causé par supprimer le script en-têtes dans Build Phases
function removeHeaders() {
find $BUILD_ROOT/... -name '*.h' -exec rm -f {} \;
}
removeHeaders
La suppression de ce script a résolu le problème.
Si vous utilisez Xcode 7.1 et CocoaPods 0.39, il semble y avoir un changement de compilateur Swift qui affecte certains CocoaPods (Nimble, Quick, etc.) Essayez certaines des solutions spécifiées dans ce fil: - https://github.com/CocoaPods/CocoaPods/issues/442 Toutefois, si aucun d'entre eux ne fonctionne, essayez d'utiliser Xcode 7.0.1 ou 7.2 beta. Vous pouvez obtenir les deux ici: https://developer.Apple.com/downloads/ .
Edit: Dans mon cas, pour résoudre le problème, je devais également rétrograder CocoaPods à 0.38.2.
Édition ultérieure: Il semble ne pas être lié à Xcode 7.1. Le simple déclassement de CocoaPods à 0.38.2 devrait aider:
Sudo gem uninstall cocoapods -v 0.39
Sudo gem install cocoapods -v 0.38.2
J'ai résolu ce problème en renommant mon module.modulemap en moduleXYZ.modulemap et en modifiant le nom du fichier modulemap dans les paramètres du projet.
Votre fichier d'en-tête doit se trouver dans la section [Build Phases/Headers/Public].
Si votre fichier d'en-tête est déjà dans la section [Build Phases/Headers/Public], plusieurs fois, le traitement suivant a résolu mon problème:
D'après mon expérience, vous devez choisir sur les cibles le framework qui vous donne l'erreur, pas la cible du projet.
Ensuite, compilez et, après la compilation, il sera disponible sur la cible du projet.