web-dev-qa-db-fra.com

Erreur du compilateur Swift: "en-tête non modulaire dans le module de structure"

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

190
Stephan

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.

public header

293
kgreenek

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
53
funroll

La solution pour moi était d'aller sur target-> build settings-> Autoriser les inclusions non modulaires in

29
Vlad Burlaciuc

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.

15
King-Wizard

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.

15
Jimmy Dee

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.

enter image description here

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.

5
seo

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.

3
Stephan

Ne pas

#import "MyOtherFramework.h"

Faire

#import <MyOtherFramework/MyOtherFramework.h>
3
hfossli

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é.

2
iyuna

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

Juste pour résumer:

  • La réponse de @ ambientlight est excellente et résout la plupart des problèmes.
  • autoriser les en-têtes non modulaires est une autre solution (voir certaines des réponses ci-dessus).
  • marquer les en-têtes du cadre comme publics (uniquement ceux que vous voulez exposer) et les importer dans l'en-tête de parapluie.

Voici mes 2 ajouts à la réponse ci-dessus:

  • vérifiez soigneusement les importations dans votre projet pour les en-têtes qui importent vos frameworks directement dans ceux-ci (au lieu d'utiliser la déclaration anticipée, si possible) - ce n'est pas une bonne pratique d'inclure un fichier d'en-tête dans un autre fichier d'en-tête; Parfois, cela cause des problèmes, car sinon, cela peut conduire à l'inclusion multiple d'un en-tête et à la création de problèmes de l'éditeur de liens.
  • UPDATE: assurez-vous que les architectures de la bibliothèque et de la cible que vous souhaitez lier correspondent.
  • et enfin, après avoir fait tout ce qui précède, je continuais de cogner sur cette erreur. J'ai donc creusé un peu plus et découvert (dans les forums de développeurs Apple, mais j'ai perdu le lien :() que si vous incluez les en-têtes dans l'en-tête d'un parapluie, ce n'est pas comme ceci <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).

2
Georgi Boyadzhiev

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.

1
Mohamed TAIEB

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.

1
Rob Sanders

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

1
m_katsifarakis

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. 

1
DevB2F

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.

1
Haris

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.

0
ColossalChris

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>
0
Yuri Korshev

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.

0
Vittal Pai