Maintenant, j'aimerais migrer mon framework ObjC vers Swift et j'ai l'erreur suivante:
include of non-modular header inside framework module 'SOGraphDB'
La référence est à un fichier d'en-tête qui définit juste un protocole et j'utilise ce fichier d'en-tête dans certaines classes pour utiliser ce protocole.
Est-ce que semble lié à la fonctionnalité de module, mais il est pour le moment pas tout à fait clair comment résoudre, connaissez-vous une solution?
METTRE À JOUR:
C'est une erreur du compilateur Swift.
MISE À JOUR 2:
Une solution rapide (sans résoudre la cause première) consiste à définir le paramètre suivant sur oui: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
Votre en-tête est-il public?
Sélectionnez le fichier d'en-tête dans l'explorateur de projet. Ensuite, dans la section de droite dans xcode, vous remarquerez qu’une liste déroulante se trouve à côté de la cible. Changez cela de "projet" en "public". Cela a fonctionné pour moi.
Voici comment appliquer automatiquement la solution rapide de sorte que vous n’ayez pas à modifier Pods.xcodeproj
manuellement après chaque pod install
.
Ajoutez cet extrait à la fin de votre fichier podfile:
post_install do |installer|
installer.pods_project.build_configuration_list.build_configurations.each do |configuration|
configuration.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
end
end
La solution pour moi était d'aller sur target-> build settings-> Autoriser les inclusions non modulaires in
Dans Swift :
1. Modifiez les paramètres de construction de votre projet Xcode et de vos cibles comme indiqué ci-dessous:
Autoriser les modules d'inclusion non modulaires dans le cadre: Non
Activer le code binaire: Oui
2. Utilisez la dernière version disponible pour le SDK GoogleMaps iOS (utilisez CocoaPods pour l'obtenir):
GoogleMaps (1.10.4)
3. Commentez l'importation problématique:
//import GoogleMaps
4. Créez ou modifiez votre fichier d'en-tête de pontage en ajoutant l'importation problématique:
[Votre nom de projet Xcode] -Bridging-Header.h
// Use this file to import your target's public headers
// that you would like to expose to Swift.
#import <GoogleMaps/GoogleMaps.h>
5. Nettoyez et reconstruisez votre projet Xcode.
Je pense que j'ai contourné ça. J'ai un code de modèle qui utilise sqlite3 dans un framework. Dans mon cas, le coupable était <sqlite3.h>.
Le problème était que dans mon en-tête Module/Module.h, j'avais importé un en-tête public qui importait <sqlite3.h>. La solution consistait à masquer tous les types sqlite3_xxx et à vous assurer qu'ils N'étaient visibles dans aucun .h. Public. Toutes les références directes à sqlite3 ont été rendues privées ou visuelles. Par exemple, un singleton public était suspendu par des pointeurs sqlite3_stmt. J'ai déplacé ceux-ci dans une classe séparée qui est maintenant seulement une déclaration forward dans cet en-tête public. Maintenant je peux construire.
Incidemment, le paramètre CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES n'a pas fonctionné. J'ai essayé de le définir à la fois dans le cadre et dans le projet dépendant. Cette solution de contournement était nécessaire, mais je ne sais pas pourquoi.
Cette réponse est obsolète.
Lors de l'importation de frameworks, vous devez importer tous les fichiers d'en-tête qui partagent des dépendances avec l'en-tête racine. Pour vous assurer que cela fonctionne toujours, le moyen le plus simple consiste à importer tous les en-têtes du dossier "En-têtes" du cadre dans votre chemin des en-têtes publics.
Le compilateur Swift utilise ces informations pour générer une carte de symboles non mutilés ainsi que leurs informations de type associées.
Le fichier d’en-tête a été affecté à la cible mais n’a été marqué que comme projet visible, mais un simple changement de public a permis de résoudre cette erreur.
Ne pas
#import "MyOtherFramework.h"
Faire
#import <MyOtherFramework/MyOtherFramework.h>
Je sais que c’est une vieille question, mais j’avais le même problème et rien d’en haut ne m’a aidé. J'espère donc que ma réponse sera utile à quelqu'un. Dans mon cas, le problème était dans le paramètre ALWAYS_SEARCH_USER_PATHS. Quand il a été réglé sur NO, le projet a été construit et a fonctionné correctement. Mais dans la mesure où l'un des pod demandait d'être réglé sur OUI, je recevais une erreur.
Inclure un en-tête non modulaire dans le module de structure
Après quelques tasses de café et des recherches d'une journée entière, j'ai découvert que, selon les numéros connus de Notes de publication de Xcode 7.1 Beta 2 :
• Si vous obtenez une erreur indiquant "Inclure l'en-tête non modulaire dans le module de structure" pour un cadre déjà compilé, assurez-vous que "Toujours rechercher les chemins d’utilisateur" le paramètre de construction est défini sur "Non". La valeur par défaut est "Oui" uniquement pour des raisons héritées. (22784786)
J'utilisais XCode 7.3 cependant, mais il semble que ce bogue n'ait pas encore été corrigé.
Je voudrais ajouter mon expérience avec le problème aussi.
Juste pour résumer:
<framework/headerName.h>
, mais seulement comme ceci "headerName.h"
, le problème disparaît.J'ai essayé ce dernier et, jusqu'à présent, je n'ai plus rencontré ce problème. Cependant, je suppose que cette solution n'est valable que si vous avez appliqué certaines des meilleures réponses (remarque: elles ne sont pas toutes compatibles les unes avec les autres, par exemple). , l’approche modulaire et l’autorisation des entêtes non modulaires).
Commutation Paramètres de construction> Autoriser les inclusions non modulaires dans les modules de cadre à OUI! résolu le même problème pour moi.
J'ai eu ce problème précis lors de l'inclusion de mon propre cadre dans un projet. Corrigé en plaçant toutes les importations de sqlite3.h dans des fichiers .m non publics. Je suppose que d'autres bibliothèques peuvent signaler des problèmes similaires avec Xcode.
Dans mon cas (Xcode 9 beta 6 - Swift 4 - en utilisant Cocoapods) cela a été résolu lorsque j'ai supprimé Podfile.lock et le répertoire Pods et que j'ai exécuté pod install
J'ai eu ce problème après la mise à jour d'un projet de Swift2 à Swift3. J'utilisais XCode 8.3.2 pour mettre à jour le code et je ne pouvais pas supprimer l'erreur «en-tête non modulaire dans le module de framework». Lorsque j'ai ouvert le même projet dans une autre version de XCode (version 9.0.1), l'erreur ne s'est pas matérialisée.
J'ai eu le problème spécifique avec Facebook 4.02 sdk et FBSDKCoreKit.
J'ai fait toutes les étapes mais toujours l'erreur sur l'en-tête non modulaire. J'ai glissé et déposé uniquement l'en-tête spécifique du framework pour construire les phases-> section d'en-tête.
Créez ensuite automatiquement une copie de l'en-tête dans le navigateur de projet en haut.
Je l'ai supprimé des phases de construction -> en-tête et j'ai supprimé le nouveau fichier et j'ai bien fonctionné.
Comme s'il était réinitialisé ou quelque chose comme ça.
Le plus souvent, cette erreur est provoquée par la réponse choisie. Pourtant, cette erreur s'est produite une fois par accident lorsque vous avez fait glisser des fichiers de structure dans mon nouveau dossier de projet. J'ai cliqué pour supprimer les cadres, mais j'ai accidentellement appuyé sur pour ne supprimer que les cadres plutôt que pour supprimer les fichiers complètement. À ce stade, si j'ai ouvert mon dossier de projet dans le Finder, j'ai vu des fichiers tels que «CoreLocation» et «AudioToolbox». La suppression de ces fichiers du dossier du projet et le nettoyage du projet ont résolu le problème.
Après avoir autorisé l'importation d'inclusions non modulaires, vous pouvez essayer d'importer ce module à l'aide de l'en-tête Objective-C Bridging:
#import <YandexMobileMetrica/YandexMobileMetrica.h>
Je l'ai résolu en supprimant le dossier Modules
du framework.
Accédez à l'emplacement de votre cadre présent dans le projet d'application à l'aide du Finder.
Allez dans le dossier Test.framework
(Dans le cas ci-dessus, ce sera le dossier SOGraphDB.framework
) & Supprimer le dossier Modules
.
Nettoyez et reconstruisez l'application, cela résoudra le problème.