Maintenant, je voudrais migrer mon framework ObjC vers Swift et j'ai eu l'erreur suivante:
include of non-modular header inside framework module 'SOGraphDB'
Les références sont à un fichier d'en-tête qui définit simplement un protocole et j'utilise ce fichier d'en-tête dans certaines classes pour utiliser ce protocole.
Cela semble lié à la fonctionnalité du module mais il n'est pas encore clair comment résoudre ce problème, connaissez-vous une solution?
METTRE À JOUR:
Il s'agit d'une erreur du compilateur Swift.
MISE À JOUR 2:
Une solution rapide (mais ne résolvant pas la cause première) consiste à définir le paramètre suivant sur oui: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
objective-c
frameworks
swift
Stephan
la source
la source
Réponses:
Votre en-tête est-il public?
Sélectionnez le fichier d'en-tête dans l'explorateur de projet. Ensuite, dans la section à droite dans xcode, vous remarquerez qu'il y a une liste déroulante à côté de la cible. Changez cela de "projet" en "public". Cela a fonctionné pour moi.
la source
Il s'agit d'un comportement de compilateur attendu et pour une très bonne raison.
Je pense que la majorité des gens qui courent dans ce problèmes est dû après passer de
Application Target
àFramework Target
et commencer à ajouter C et en- têtes Objective C dans de cadre en- tête parapluie attendant qu'il ait un même comportement que Bridging - tête de l' application , qui se comporte différemment. L'en-tête de parapluie est en fait désigné pour le cadre mixte rapide et obj-c et son but est d'exposer les API au monde extérieur que votre cadre a en objectif-c ou c. Cela signifie que les en-têtes que nous y mettons devraient être de portée publique.Il ne doit pas être utilisé comme un endroit qui expose les en-têtes Objective-C / C qui ne font pas partie de votre framework au code rapide de votre framework. Parce que dans ce cas, ces en-têtes seront également exposés dans le cadre de notre module de cadre au monde extérieur, ce qui n'est souvent pas ce que nous voulons faire car il rompt la modularité. (Et c'est exactement la raison pour laquelle Autorise les modules non modulaires inclus dans le cadre des modules par défaut à NO )
Afin d'exposer la bibliothèque Objective-C / C à votre code Swift de framework, nous devons définir un module Swift distinct pour cette bibliothèque. Ensuite, un swift standard
import YourLegacyLibrary
peut être utilisé.Permettez-moi de le démontrer sur un scénario typique: l'intégration
libxml2
dans notre cadre.1. Vous devez d'abord créer un
module.modulemap
fichier qui ressemblerait à ceci:Pour le framework OSX:
Pour le framework iOS:
Tout ce qu'il fait, c'est qu'il enveloppe l'en-tête et tous les autres en-têtes auxquels il fait référence dans le module swift, afin que swift puisse ensuite générer les liaisons swift pour ces interfaces C.
2. Ensuite, dans votre répertoire de projet xcode, créez un dossier
SwiftLibXML2
et placez-y ce module.modulemap3. Dans Build Settings , ajoutez
$(SDKROOT)/usr/include/libxml2
aux en- têtes des chemins de recherche4. Dans Build Settings , ajoutez
$(SRCROOT)/SwiftLibXML2
à Import Paths5. Sous l' onglet Général du projet , ajoutez-le
libxml2.tbd
aux cadres et bibliothèques liés .Maintenant, vous importez ce module si nécessaire avec:
(si vous voulez regarder un exemple de module.map plus complet, je suggérerais de référencer le module.modulemap de Darwin à
/usr/include/module.modulemap
, vous auriez besoin d'avoir des outils de ligne de commande Xcode installés pour y aller, référence Missing / usr / include dans OS X El Capitan )la source
module.map
est obsolète, il doit être renommémodule.modulemap
clang.llvm.org/docs/Modules.html#attributesimport SwiftLibXML2
dans Objective-C? Merci!Voici comment appliquer automatiquement le correctif rapide afin que vous n'ayez pas à modifier
Pods.xcodeproj
manuellement après chaquepod install
.Ajoutez cet extrait à la fin de votre Podfile:
la source
La solution pour moi était d'aller sur la cible -> les paramètres de construction -> Autoriser les inclusions non modulaires dans le commutateur des modules de structure sur OUI!
la source
Je pense que j'ai contourné cela. J'ai du code 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 à s'assurer qu'ils n'étaient visibles dans aucun .h public. Toutes les références directes à sqlite3 ont été rendues privées ou visibles par le projet. Par exemple, j'avais un singleton public avec des pointeurs sqlite3_stmt accrochés. J'ai déplacé ceux-ci dans une classe distincte qui n'est maintenant qu'une déclaration directe dans cet en-tête public. Maintenant je peux construire.
Par ailleurs, le paramètre CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES n'a pas fonctionné. J'ai essayé de le placer à la fois dans le cadre et le projet dépendant. Cette solution de contournement était nécessaire, mais je ne sais pas pourquoi.
la source
Dans Swift :
1. Modifiez les paramètres de construction de votre projet Xcode et de vos cibles comme indiqué ci-dessous:
Autoriser les modules non modulaires inclus dans le cadre: Non
Activer le Bitcode: Oui
2. Utilisez la dernière version actuelle disponible pour le SDK iOS GoogleMaps (utilisez CocoaPods pour l'obtenir):
GoogleMaps (1.10.4)
3. Commentez l'importation problématique:
4. Créez ou modifiez votre fichier d'en-tête de pontage, en ajoutant l'importation problématique:
[Nom de votre projet Xcode] -Bridging-Header.h
5. Nettoyez et reconstruisez votre projet Xcode.
la source
Cette réponse est dépassée.
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. Le moyen le plus simple de vous assurer que cela fonctionne toujours consiste à importer tous les en-têtes du dossier "En-têtes" du framework dans votre chemin d'en-tête public.
Le compilateur Swift utilise ces informations pour générer une carte de symboles non modifiés avec leurs informations de type associées.
la source
Ne le fais pas
Faire
la source
Le fichier d'en-tête a été alloué à la cible mais n'a été marqué que comme projet visible, un simple changement de public a permis de résoudre cette erreur.
la source
Je sais que c'est une vieille question, mais j'ai eu 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é défini sur NO, le projet a été construit et a fonctionné correctement. Mais dans la mesure où l'un des pods exigeait qu'il soit réglé sur OUI, je recevais une erreur
Après quelques tasses de café et des recherches toute la journée, j'ai découvert que, selon les problèmes connus des notes de version de Xcode 7.1 Beta 2 :
J'utilisais cependant XCode 7.3, mais il semble que ce bogue n'ait pas encore été corrigé.
la source
Basculer les paramètres de build> Autoriser les inclusions non modulaires dans les modules Framework à YES! résolu le même problème pour moi.
la source
Je voudrais également ajouter mon expérience avec le problème.
Juste pour résumer:
Voici mes 2 ajouts aux réponses ci-dessus:
<framework/headerName.h>
, mais seulement comme ça"headerName.h"
, le problème disparaît.J'ai essayé cette dernière, et jusqu'à présent, je n'ai plus rencontré ce problème, mais je soupçonne que cette solution n'est valide 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 du module et l'autorisation de l'en-tête non modulaire incluent).
la source
J'ai eu ce problème exact lors de l'inclusion de mon propre cadre dans un projet. Le problème a été résolu en plaçant toutes les importations de sqlite3.h dans des fichiers .m et non dans des fichiers publics .h. Je suppose que d'autres bibliothèques peuvent signaler des problèmes similaires avec Xcode.
la source
J'ai eu le problème spécifique avec Facebook 4.02 sdk et FBSDKCoreKit.
J'ai fait toutes les étapes mais toujours une erreur sur l'en-tête non modulaire. J'ai fait glisser et déposé uniquement l'en-tête spécifique du cadre pour créer des phases-> section d'en-tête.
Puis créé automatiquement une copie de l'en-tête sur le navigateur de projet en haut.
Je l'ai supprimé des phases de construction -> en-tête et supprimé le nouveau fichier et a bien fonctionné.
Comme si c'était réinitialisé ou quelque chose.
la source
Dans mon cas (Xcode 9 beta 6 - Swift 4 - utilisant des Cocoapods), cela a été résolu lorsque j'ai supprimé Podfile.lock et le répertoire Pods et que j'ai exécuté de
pod install
nouveaula source
J'ai eu ce problème après avoir mis à jour un projet de swift2 vers swift3. J'utilisais XCode 8.3.2 pour mettre à jour le code et je n'ai pas pu me débarrasser de l'erreur «en-tête non modulaire à l'intérieur du 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 produite.
la source
Le plus souvent, cette erreur est due à la réponse choisie, mais cette erreur s'est produite une fois par accident lors du glissement des fichiers de framework dans mon nouveau dossier de projet. J'ai cliqué pour supprimer les frameworks, mais j'ai accidentellement appuyé pour ne supprimer que les références aux frameworks plutôt que de supprimer complètement les fichiers. À ce stade, si j'ouvrais mon dossier de projet dans le Finder, j'y voyais des fichiers comme «CoreLocation» et «AudioToolbox». La suppression de ces fichiers du dossier du projet et le nettoyage du projet ont résolu le problème.
la source
Après avoir autorisé l'importation d'importations non modulaires, vous pouvez essayer d'importer ce module à l'aide de l'en-tête de pontage Objective-C:
la source
Je l'ai résolu en supprimant le
Modules
dossier du cadre.Accédez à l'emplacement de votre framework qui est présent dans le projet d'application à l'aide du Finder
Allez dans le
Test.framework
dossier (dans le cas ci-dessus, ce sera le casSOGraphDB.framework
) et supprimez leModules
dossier.Nettoyez et reconstruisez l'application, cela résoudra le problème.
la source
J'ai eu ce problème lors de l'importation du framework Parse. La seule façon de le corriger était de supprimer toutes mes modifications depuis mon dernier commit (simplement supprimer le framework et nettoyer le projet n'a pas fonctionné) et ajouter à nouveau Parse (après un nouveau téléchargement du SDK) avec ses autres frameworks requis.
la source