web-dev-qa-db-fra.com

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

J'utilise Xcode 6,

1) Je crée tout d'abord une bibliothèque dynamique (CoreLibrary). Cette bibliothèque contient le fichier RequestPoster.h.

2) Ensuite, j'ai créé un cadre Cocoa Touch et ajouté cette bibliothèque dynamique (CoreLibrary).

3) Ensuite, ce cadre est ajouté à mon projet et donne une erreur dans le fichier RequestPoster.h (CoreLibrary).

Erreur: inclusion d'un en-tête non modulaire dans le module de framework Class:

ifaddrs.h, arpa/inet.h, sys/types.h>

Ces fichiers ne sont pas trouvés dans le projet.

111
Dev

Essayez de définir les paramètres de construction sous "Cible" et définissez "Autoriser les inclusions non modulaires dans les modules de cadre" sur OUI.

La vraie réponse est que l'emplacement des importations doit être modifié par le propriétaire de la bibliothèque. Les fichiers ifaddrs.h, arpa/inet.h, sys/types.h sont importés dans un fichier .h dans un framework, ce que Xcode n'aime pas. Le responsable de la bibliothèque doit les déplacer dans un fichier .m. Voir par exemple ce problème sur GitHub, où AFNetworking corrige le même problème: https://github.com/AFNetworking/AFNetworking/issues/2205

164
bcattle

Assurez-vous que les fichiers d'en-tête sont accessibles au public en tant qu'éléments des en-têtes publics du framework. 

Goto Framework -> Target -> Build Phases et faites glisser pour déplacer les fichiers d'en-tête appropriés de Project à Public. J'espère que cela pourra aider!

Screenshot

98
Long Pham

Vous pouvez définir Autoriser les inclusions non modulaires dans Modules de structure dans les paramètres de construction de la cible affectée sur YES. C'est le paramètre de construction que vous devez éditer:

 Build Settings item you need to edit

NOTE: vous devriez utiliser cette fonctionnalité pour découvrir l'erreur sous-jacente, que j'ai souvent trouvée causée par la duplication des inclusions globales entre crochets, dans des fichiers avec une relation dépendante, c'est-à-dire: 

#import <Foo/Bar.h> // referred to in two or more dependent files

Si définir Autoriser les inclusions non modulaires dans Frame Modules sur YES entraîne un ensemble d'erreurs "X est une référence ambiguë" ou quelque chose du genre, vous devriez pouvoir localiser l'infraction incriminée. dupliquer (s) et les éliminer. Une fois que vous avez nettoyé votre code, définissez Autoriser les inclusions non modulaires dans Frame Modules sur NO

67
revprez

J'ai eu le même problème et le résoudre en rendant simplement le fichier d'en-tête public. [problem]

Si vous travaillez sur plusieurs modules dans votre projet. Ensuite, votre fichier d'en-tête doit être public pour pouvoir être utilisé dans d'autres parties de projets. Ce qu'il vous faut, c'est sélectionner ce fichier d'en-tête et la vue Utilitaires du projet. Modifiez le fichier de Project/Private à Public. Voir l'image ci-dessous:

 Changing header file scope

21
Saad

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

Lorsque vous obtenez cette erreur, la solution dans certaines circonstances peut être simplement de marquer le fichier que vous essayez d'importer en tant que "public" dans l'inspecteur de fichiers "Adhésion à la cible". La valeur par défaut est "Projet" et, lorsqu'elle est définie de cette manière, elle peut provoquer cette erreur. Ce fut le cas avec moi lorsque j'essayais d'importer les en-têtes de Google Analytic dans un cadre, par exemple.

14
John Bushnell

En fait, un moyen plus simple de résoudre ce problème consiste à déplacer l’instruction #import en haut du fichier .m (au lieu de l’avoir dans votre fichier d’en-tête .h). De cette façon, il ne se plaindra pas d'inclure un fichier d'en-tête non modulaire. J'ai eu ce problème où Allow non-module includes défini sur YES faisaitNOTtravail pour moi, donc en le déplaçant dans le fichier d'implémentation, il a cessé de se plaindre. C'est en fait le moyen privilégié d'importer et d'inclure les fichiers d'en-tête de toute façon. Une fois que cela est fait, remettre cette valeur à NO devrait fonctionner.

Idéalement, nous devrions essayer d’avoir Allow non-module includes défini sur NO. Régler ceci à YES dans la plupart des cas signifie que vous faites quelque chose de mal. Le paramètre se traduit par "Autoriser l'importation sur la disquette de fichiers d'en-tête aléatoires qui ne font par ailleurs pas partie du module". Ceci s’applique à très peu de cas d’utilisation dans la pratique. Ce paramètre doit donc toujours être NO (c’est-à-dire la valeur par défaut).

14
strangetimes

Si vous développez votre propre framework:

Pourquoi cela arrive-t-il?

Si l’un des fichiers d’en-tête publics que vous avez mentionnés dans votre module.modulemap contient des instructions d’importation qui ne sont pas mentionnées dans dans modulemap, cela vous donnera l’erreur. Puisqu'il tente d'importer un en-tête qui n'est pas déclaré modulaire (dans module.modulemap), il rompt la modularité du cadre.

COMMENT puis-je résoudre ce problème?

Incluez simplement l'en-tête qui a donné l'erreur à votre module.modulemap et générez à nouveau!

POURQUOI ne pas définir autoriser non modulaire à OUI

Parce que ce n’est pas vraiment une solution ici, avec cela vous dites à votre projet "ce cadre était supposé être modulaire, mais ce n’est pas le cas. Utilisez-le d’une manière ou d’une autre, ça m'est égal." Cela ne résout pas le problème de modularité de votre bibliothèque.

Pour plus d'informations, consultez ce blog post ou reportez-vous à clang docs .

7
Mert Celik

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 AUCUN projet n’a été construit et fonctionne 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 à l'intérieur du module de framework .__" pour un framework compilé précédemment, assurez-vous que le paramètre de construction "Toujours rechercher les chemins d'utilisateur" est défini sur "Non". Le 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é.

5
iyuna

le même problème rend crazy.finally, je trouve que mettre l'import xxx.h dans l'implémentation au lieu de l'interface peut résoudre le problème.Et si vous utilisez Cocoapods pour gérer votre projet.vous pouvez ajouter 

s.user_target_xcconfig = {'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'OUI'}

dans votre fichier 'xxx.podspec'.

4
贺彦文

Si vous voyez cette erreur dans un en-tête umbrella lors de la construction d'un framework dynamic, veillez à importer votre fichier comme suit:

#import "MyFile.h"

et pas comme #import <MyFramework/MyFile.h>.

3
Misha Karpenko

Si vous en avez besoin pour les cibles CocoaPods, ajoutez ces lignes dans Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      target.build_settings(config.name)['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
    end
  end
end
3
k06a

C'était une sorte de problème ennuyant pour moi. Aucune suggestion n'a semblé aider mon cas particulier, car j'avais besoin d'inclure les en-têtes "non modulaires" dans mon fichier d'en-tête de fichier individuel. Le travail que j'ai utilisé consistait à coller l'appel d'importation dans le fichier d'en-tête du préfixe.

1
Greg

Dans mon cas, j'ai oublié d'ajouter le fichier .h et .m dans la section "s.source_files" du fichier .podspecs.

après avoir ajouté cela, cela fonctionne bien.

 enter image description here 

0

J'ai fini par déplacer l'en-tête Umbrella en bas de la liste des en-têtes après avoir vérifié les solutions ci-dessus, ce qui fonctionnait sous Xcode 9.3.

0
alfwatt

Je suis également tombé sur ce problème et je pensais au départ qu’il s’agissait d’un problème lié à CocoaPods, mais c’était un problème dans les paramètres de création des applications où un utilisateur (probablement moi) avait défini ${PODS_ROOT} dans les chemins de recherche d’en-tête et le définissait comme un recursive recherche. Cela lui permettait de trouver des en-têtes qui n'étaient pas destinés à être utilisés lors de la construction de l'application. Une fois que je l'ai configuré pour utiliser non-recursive tout allait bien. Utiliser recursive search est un hack terrible pour essayer de trouver les en-têtes appropriés. Leçon apprise.

0
ucangetit

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 CoreLibrary.framework) & Supprimer le dossier Modules

  • Nettoyez et reconstruisez l'application, cela résoudra le problème.

0
Vittal Pai