objective-c - you - xcode add bridging header file




Erreur de compilation rapide: "en-tête non-modulaire dans le module de structure" (12)

Maintenant, je voudrais migrer mon framework ObjC vers Swift et j'ai 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.

Est semble lié à la fonctionnalité du module, mais il est pour le moment pas tout à fait clair comment réparer, connaissez-vous une solution?

METTRE À JOUR:

C'est 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 yes: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES


Après avoir autorisé l'importation d'inclusions non modulaires, vous pouvez essayer d'importer ce module à l'aide de l'en-tête Bridging Objective-C:

#import <YandexMobileMetrica/YandexMobileMetrica.h>

C'est un comportement de compilateur attendu et pour une très bonne raison.

Je pense que la majorité des personnes rencontrant ces problèmes sont provoquées après avoir basculé de Application Target vers Framework Target et commencé à ajouter des en-têtes C et Objective C dans l'en-tête du framework en supposant que le comportement est le même que celui de l' application . L'en-tête parapluie est en fait désigné pour un cadre mixte swift, obj-c et son but est d'exposer les API au monde extérieur que votre framework a dans l'objectif-c ou c. Cela signifie que les en-têtes que nous mettons là devraient être dans la portée publique.

Il ne doit pas être utilisé comme un emplacement exposant les en-têtes Objective-C / C qui ne font pas partie de votre infrastructure au code de progression de votre infrastructure. Car dans ce cas ces en-têtes seront également exposés comme la partie de notre module cadre au monde extérieur, ce qui n'est souvent pas ce que nous voulons faire car cela rompt la modularité. (Et c'est exactement pourquoi les inclusions non modulaires dans les modules de structure par défaut sont NO )

Afin d'exposer la bibliothèque Objective-C / C à votre code swift, vous devez définir un module swift séparé pour cette bibliothèque. Une import YourLegacyLibrary rapide standard import YourLegacyLibrary peut alors être utilisée.

Permettez-moi de le démontrer sur un scénario typique: l'intégration de libxml2 dans notre framework.

1. Vous devez d'abord créer un fichier module.modulemap qui ressemblerait à ceci:

Pour le framework OSX:

module SwiftLibXML2 [system] {
  header "/usr/include/libxml2/libxml/xpath.h"
  export *
}

Pour le cadre iOS:

module SwiftLibXML2 [system] {
  header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
  export *
}

Tout ce qu'il fait est qu'il encapsule l'en-tête et tous les autres en-têtes qu'il référence dans le module swift, de sorte que swift puisse alors générer les liaisons rapides pour ces interfaces C.

2. Ensuite, dans votre répertoire de projet xcode, créez un dossier SwiftLibXML2 et placez ce module.

3. Dans Paramètres de construction , ajoutez $(SDKROOT)/usr/include/libxml2 aux chemins de recherche d'en-tête

4. Dans Paramètres de construction , ajoutez $(SRCROOT)/SwiftLibXML2 à des chemins d'importation

5. Sous l'onglet Général du projet, ajoutez libxml2.tbd aux cadres et bibliothèques liés .

Vous importez maintenant ce module là où vous le souhaitez avec:

import SwiftLibXML2

(Si vous voulez regarder un exemple de module.map plus complet, je suggérerais de référencer le module.modulemap de Darwin dans /usr/include/module.modulemap , vous aurez besoin d'outils de ligne de commande Xcode pour y aller, référence Missing / usr / include dans OS X El Capitan )


Dans mon cas (Xcode 9 beta 6 - Swift 4 - en utilisant Cocoapods) cela a été résolu quand j'ai supprimé Podfile.lock et le répertoire Pods et j'ai couru l' 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 ne pouvais pas 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 n'apparaissait pas.


J'ai eu ce problème exact en incluant mon propre cadre dans un projet. Corrigé en mettant toutes les importations de sqlite3.h dans les fichiers .m pas dans les fichiers .h publics. Je suppose que d'autres bibliothèques peuvent signaler des problèmes similaires avec Xcode.


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 au sujet de l'en-tête non modulaire. Je n'ai fait glisser que l'en-tête spécifique de la structure pour créer des phases -> section d'en-tête.

Puis automatiquement créé une copie de l'en-tête sur le navigateur de projet en haut.

Je l'ai enlevé de l'en-tête phases de construction -> et supprimé le nouveau fichier et a bien fonctionné.

Comme il a été réinitialisé ou quelque chose.


Je sais que c'est une vieille question, mais j'ai eu le même problème et rien d'en haut m'a aidé. J'espère donc que ma réponse sera utile pour quelqu'un. Dans mon cas, le problème était dans le paramètre ALWAYS_SEARCH_USER_PATHS. Quand il a été mis à AUCUN projet construit et a bien fonctionné. Mais dans la mesure où l'un des pod l'exigeait d'être réglé sur OUI, je recevais une erreur

Inclure l'en-tête non modulaire dans le module de structure

Après quelques tasses de café et toute la journée de recherche, j'ai découvert que, selon les problèmes connus de Xcode 7.1 Beta 2 notes de publication :

• Si vous obtenez une erreur indiquant "Inclure un en-tête non modulaire dans un module de structure" pour un framework précédemment compilé, assurez-vous que le paramètre de construction "Toujours rechercher les chemins d'accès utilisateur" 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 bug n'a pas encore été corrigé.


Je voudrais ajouter mon expérience avec le problème aussi.

Juste pour résumer:

  • La réponse @ ambientlight est géniale et corrige la plupart des problèmes.
  • autoriser les en-têtes non modulaires est une autre solution (voir certaines des réponses ci-dessus)
  • marquant les en-têtes du cadre comme publics (seulement la fois que vous voulez exposer) et les importer dans l'en-tête du parapluie
  • voici mes 2 ajouts à la réponse
  • Vérifiez soigneusement les importations dans votre projet pour les en-têtes qui importent directement vos frameworks (si vous préférez utiliser la déclaration forward si possible), il n'est pas recommandé d'inclure un fichier d'en-tête dans un autre fichier d'en-tête. pas fait correctement cela peut conduire à plusieurs, y compris d'un en-tête et les problèmes de l'éditeur de liens
  • et enfin après avoir fait tout ce qui précède, je continuais toujours à se cogner sur cette erreur, donc j'ai creusé un peu plus et trouvé (dans les forums de développeurs Apple, mais perdu le lien :(), que si vous incluez les en-têtes dans l'en-tête comme ceci <framework/headerName.h> , mais seulement comme ceci "headerName.h" , le problème disparait, j'ai essayé ceci et pour l'instant je n'ai plus rencontré ce problème, cependant je pense que cette solution n'est valable que si Vous avez appliqué certaines des meilleures réponses (elles ne sont pas toutes compatibles les unes avec les autres, par exemple l'approche de module et l'autorisation de l'en-tête non modulaire)

ADDITION: vérifier les architectures de la bibliothèque et celle de la cible que vous voulez lier à


Le fichier d'en-tête a été alloué à la cible mais a seulement été marqué comme projet visible, juste une modification de l'intérêt public à la résolution de cette erreur.


Le plus souvent cette erreur est causée par la réponse choisie, mais j'ai eu cette erreur apparaître une fois par accident en faisant glisser des fichiers de cadre dans mon nouveau dossier de projet. J'ai cliqué pour supprimer les cadres, mais accidentellement pressé à seulement «Supprimer référence» aux cadres plutôt que de réellement supprimer les fichiers complètement. À ce stade, si j'ai ouvert mon dossier de projet dans le Finder, j'ai vu des fichiers comme «CoreLocation» et «AudioToolbox» là. La suppression de ces fichiers du dossier du projet et le nettoyage du projet ont résolu le problème.


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" à "public". Cela a fonctionné pour moi.


Cette réponse est périmée.

Lors de l'importation de cadres, vous devez importer tous les fichiers d'en-tête partageant les dépendances avec l'en-tête racine. Le moyen le plus simple de s'assurer que cela fonctionne toujours est d'importer tous les en-têtes du dossier "Headers" du framework dans votre chemin d'en-tête public.

Le compilateur Swift utilise cette information pour générer une carte de symboles non mutilés avec leurs informations de type associées.





swift