web-dev-qa-db-fra.com

Swift Framework: En-tête de parapluie '[...]. H' introuvable

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'
103
Tim Bodeit

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

25
Tim Bodeit

Cela se produit généralement après un changement de nom de projet ou quelque chose comme ça. Le problème est que l'en-tête de parapluie n'est plus répertorié comme un en-tête public . Vérifiez l'image jointe pour voir comment résoudre ce problème.

Fix

208
arturgrigor

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

43
Claude Houle

Cela peut se produire de 4 manières différentes, en ignorant les bugs des versions précédentes de Xcode.

  • Vous n'avez pas d'en-tête de parapluie nommé $ (TARGET_NAME) .h dans votre projet
  • Vous avez un en-tête de parapluie, mais il n'est pas défini comme public. Voir la réponse d'arturgrigor
  • DEFINES_MODULE n'est pas défini sur YES
  • CLANG_ENABLE_MODULES n'est pas défini sur YES
37
Claus Jørgensen

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.

18
Aleksei Minaev

Vous devez certainement définir votre cadre sur public:

enter image description here

11

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!)

7
Danra

Pour moi, régler "Utiliser les cartes d'en-tête" sur "NON" a résolu le problème.

7
xySVerma

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.

4
Max MacLeod

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.

https://github.com/Jon889/SwiftImportChecker

3
Jonathan.

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.

1
Ana Figueira

Supprimez ces fichiers du répertoire du projet. .xcworkspacepods/ et podfile.lock

mettre à jour le pod et construire le projet.

0
Subhash

Je l'ai corrigé en rendant le mode de compilation des paramètres de construction du cadre problématique en incrémental.

0
Ghislain Leblanc

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.

0
phnmnn

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
0
Marius

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.

0
retterdesapok

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:

  1. nettoyer le projet
  2. déplacez le fichier d'en-tête vers la section "private" ou "project"
  3. déplace le fichier d'en-tête vers la section "public"
  4. tout reconstruire à nouveau
0
Andrei A.

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.

0
Eironeia