Aufnahme eines nicht modularen Headers in das Framework-Modul


143

Ich benutze Xcode 6,

1) Zuerst erstelle ich eine dynamische Bibliothek (CoreLibrary). Diese Bibliothek enthält die Datei RequestPoster.h.

2) Dann erstelle ich ein Cocoa Touch Framework und füge diese dynamische Bibliothek (CoreLibrary) hinzu.

3) Dann wird dieses Framework zu meinem Projekt hinzugefügt und es gibt einen Fehler in der Datei RequestPoster.h (CoreLibrary).

Fehler: Einschließen eines nicht modularen Headers in die Framework-Modulklasse:

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

Diese Datei wurde im Projekt nicht gefunden.

Antworten:


190

Versuchen Sie, unter "Ziel" die Build-Einstellungen aufzurufen, und setzen Sie "Nicht modulare Includes in Framework-Modulen zulassen" auf YES.

Die eigentliche Antwort lautet, dass der Speicherort der Importe vom Bibliotheksbesitzer geändert werden muss. Diese Dateien ifaddrs.h, arpa / inet.h, sys / types.h werden in eine .h-Datei in einem Framework importiert, das Xcode nicht mag. Der Bibliotheksverwalter sollte sie in eine .m-Datei verschieben. Siehe zum Beispiel dieses Problem auf GitHub, wo AFNetworking das gleiche Problem behoben hat: https://github.com/AFNetworking/AFNetworking/issues/2205


2
Was wird empfohlen, wenn der fehlerhafte Header einen Typ aus den importierten Headern verwendet? Wenn beispielsweise der Header module.h im Modul eine Funktion deklariert, die einen Parameter vom Typ ifaddrsannimmt, müssen sie ifaddrs.h importieren.
Ayush Goel

Aber was ist, wenn sie System enthalten, wie /usr/include/libproc.h?
Ben Leggiero

3
Könnten Sie bitte erklären, welche Auswirkungen Änderungen haben: Nicht modulare
Einschlüsse

170

Stellen Sie sicher, dass die Header-Dateien als Teil der öffentlichen Header des Frameworks öffentlich verfügbar sind.

Gehen Sie zu Framework -> Ziel -> Phasen erstellen und ziehen Sie, um die relevanten Header-Dateien von Projekt nach Öffentlich zu verschieben. Hoffentlich hilft das!

Bildschirmfoto


3
Das hat mir geholfen, Objective C-Code in ein Swift-Framework aufzunehmen, danke!
Vadim

1
Sie können diese Änderung auch in der Zielmitgliedschaft von Projekt zu Öffentlich in Ihrer Datei vornehmen, indem Sie das Fenster Dateiinspektor rechts im Hauptbildschirm von XCode verwenden.
Pigpocket

Wenn Sie die Bibliothek in eine Mischung aus swift / objc importieren, müssen Sie sicherstellen, dass der Bridging-Header auch öffentlich ist. Fehler, den ich gemacht habe!
Nick H247

74

Sie können Zulassen, dass nicht modulare Includes in Framework-Modulen in den Build-Einstellungen für das betroffene Ziel für JA festgelegt sind. Dies ist die Build-Einstellung, die Sie bearbeiten müssen:

Erstellen Sie das Element Einstellungen, das Sie bearbeiten müssen

HINWEIS : Sie sollten diese Funktion verwenden, um den zugrunde liegenden Fehler aufzudecken, der häufig durch das Duplizieren von globalen Includes in spitzen Klammern in Dateien mit einer abhängigen Beziehung verursacht wird, z.

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

Wenn die Einstellung " Nicht modulare Einschlüsse in Frame-Modulen zulassen" auf " JA" führt und eine Reihe von Fehlern "X ist eine mehrdeutige Referenz" oder ähnliches auftritt, sollten Sie in der Lage sein, die fehlerhaften Duplikate aufzuspüren und zu beseitigen. Nachdem Sie Ihren Code bereinigt haben, setzen Sie "Nicht modulare Einschlüsse in Frame-Modulen zulassen" wieder auf " NEIN" .


1
Ok, es waren die spitzen Klammern, die das Problem verursachten! Ich hatte dieses Problem mit einem CocoaPods-Import und habe es behoben, indem ich den Import so geändert habe, dass Anführungszeichen anstelle von spitzen Klammern verwendet werden.
Michael Forrest

Ups, nein, hat es nicht. Entdeckt, dass es kaputt war, nachdem ich mein Projekt gereinigt hatte: - /
Michael Forrest

2
Ich kann keinerlei "mehrdeutige Referenz" -Warnungen finden. Was sind die Nachteile, wenn Sie es auf JA setzen ?
Nicolas Miari

28

Ich hatte das gleiche Problem und löste es, indem ich nur die Header-Datei öffentlich machte. [Problem]

Wenn Sie in Ihrem Projekt an mehreren Modulen arbeiten. Dann muss Ihre Header-Datei öffentlich sein, damit sie in anderen Teilen von Projekten verwendet werden kann. Sie müssen diese Header-Datei und in der Ansicht "Projektdienstprogramme" auswählen. Ändern Sie die Datei von Projekt / Privat in Öffentlich. Siehe Bild unten:

Ändern des Bereichs der Header-Datei


Dies geschieht insbesondere, wenn Sie einen vorhandenen öffentlichen Header duplizieren. Die doppelte Header-Mitgliedschaft wird in "Projekt" geändert
Jeremie

Nein, es ist nicht obligatorisch für die Vervielfältigung. Dies kann in verschiedenen Fällen auftreten, wenn Sie beispielsweise ein Projekt vollständig als Bibliothek in Ihr Projekt importieren und dann versuchen, die privaten Klassen zu ändern. Sie kennen die Header-Datei und schreiben sie, aber der Zugriff ist nicht für alle Projekte öffentlich.
Saad

22

"Einfügen eines nicht modularen Headers in das Framework-Modul"

Wenn Sie diesen Fehler erhalten, kann die Lösung unter bestimmten Umständen darin bestehen, die zu importierende Datei im Dateiinspektor "Zielmitgliedschaft" einfach als "öffentlich" zu markieren. Der Standardwert ist "Projekt". Wenn dies so eingestellt wird, kann dies zu diesem Fehler führen. Dies war bei mir der Fall, als ich beispielsweise versuchte, die Header von Google Analytic in ein Framework zu importieren.


Diese Antwort hat mir bei meinem ähnlichen Problem sehr geholfen. Ich wusste nicht, dass Framework-Header-Dateien zum Ziel hinzugefügt werden können. In Anwendungsprojekten sind Header niemals Teil eines Ziels.
Bio

20

Eine einfachere Möglichkeit, dies zu beheben, besteht darin, die #importAnweisung .mstattdessen an den Anfang der Datei zu verschieben (anstatt sie in Ihrer .hHeader-Datei zu haben). Auf diese Weise wird nicht beanstandet, dass eine nicht modulare Header-Datei enthalten ist. Ich hatte dieses Problem, bei dem Allow non-module includeseingestellt wurde, dass YESes NICHT für mich funktioniert. Durch das Verschieben in die Implementierungsdatei hörte es auf, sich zu beschweren. Dies ist in der Tat die bevorzugte Methode zum Importieren und Einfügen von Header-Dateien. Sobald Sie dies getan haben, setzen Sie dies zurück aufNO funktionieren.

Idealerweise sollten wir versuchen, uns darauf Allow non-module includeseingestellt zu haben NO. Wenn Sie dies YESin den meisten Fällen einstellen, bedeutet dies, dass Sie etwas falsch machen. Die Einstellung bedeutet "Importieren von zufälligen Header-Dateien auf die Festplatte zulassen, die sonst nicht Teil des Moduls sind". Dies gilt in der Praxis für einige wenige Anwendungsfälle. Daher sollte diese Einstellung immer sein NO(dh der Standardwert).


10

Für den Fall, dass Sie Ihr eigenes Framework entwickeln:

Warum passiert dies?

Wenn eine der öffentlichen Header-Dateien, die Sie in Ihrer module.modulemap erwähnt haben, Importanweisungen enthält, die in modulemap nicht erwähnt werden, wird der Fehler angezeigt. Da versucht wird, einen Header zu importieren, der nicht als modular deklariert ist (in module.modulemap), wird die Modularität des Frameworks unterbrochen.

Wie kann ich es reparieren?

Fügen Sie einfach den Header hinzu, der den Fehler in Ihrer module.modulemap verursacht hat, und erstellen Sie ihn erneut!

WARUM NICHT einfach nicht modular auf JA setzen lassen?

Da es hier keine wirkliche Lösung ist, sagen Sie Ihrem Projekt: "Dieses Framework sollte modular sein, ist es aber nicht. Verwenden Sie es irgendwie, es ist mir egal." Dies behebt das Modularitätsproblem Ihrer Bibliothek nicht.

Weitere Informationen finden Sie in diesem Blogbeitrag oder in den Clang-Dokumenten .


Wie haben Sie die module.modulemap mit dem Framework für Kakaoprojekte eingerichtet? Ich habe versucht, meine Bibliothek mit Swift-only-Projekten arbeiten zu lassen. Da jedoch eine Abhängigkeit der Bibliothek besteht, funktioniert die module.modulemap nicht, der Cocoapod Automatische Generierung der Modulkarte, aber es scheint nicht zu funktionieren. Haben Sie etwas Ähnliches erlebt?
Amadeu Cavalcante Filho

8

Wenn Sie dies für CocoaPods-Ziele benötigen, fügen Sie diese Zeilen hinzu in 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

7

Allow Non-modular Includes in Framework Modulesfunktionieren nur im objc code. nicht schnell arbeiten.

Nach einer gewissen Zeit der Recherche stellte ich fest, dass Swift den Warnparameter an clang übergeben kann, also so eingestellt OTHER_SWIFT_FLAGS, -Xcc -Wno-error=non-modular-include-in-framework-moduledass ein schneller Importfehler verhindert wird.

Nur für jemanden, der das gleiche Problem hat


6

Ich hatte das gleiche Problem und nichts von oben half mir. Ich hoffe, meine Antwort ist für jemanden hilfreich. In meinem Fall lag das Problem in der Einstellung ALWAYS_SEARCH_USER_PATHS. Als es auf KEIN Projekt gesetzt wurde, wurde es gebaut und funktionierte in Ordnung. Aber soweit einer der Pods die Einstellung auf JA erforderte, erhielt ich einen Fehler

Aufnahme eines nicht modularen Headers in das Framework-Modul

Nach ein paar Tassen Kaffee und den ganzen Tag Recherche fand ich heraus, dass nach bekannten Problemen von Xcode 7.1 Beta 2 Versionshinweise :

• Wenn bei einem zuvor kompilierten Framework die Fehlermeldung "Nicht modularen Header in Framework-Modul einschließen" angezeigt wird, stellen Sie sicher, dass die Build-Einstellung "Immer Benutzerpfade suchen" auf "Nein" gesetzt ist. Der Standardwert ist "Ja" nur aus älteren Gründen. (22784786)

Ich habe zwar XCode 7.3 verwendet, aber anscheinend wurde dieser Fehler noch nicht behoben.


6

Das gleiche Problem macht verrückt. Schließlich finde ich, dass die Implementierung von 'import xxx.h' anstelle der Schnittstelle das Problem beheben kann. Und wenn Sie Cocoapods verwenden, um Ihr Projekt zu verwalten. Sie können hinzufügen

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

in Ihrer 'xxx.podspec'-Datei.


6

Wenn dieser Fehler beim Erstellen eines dynamischen Frameworks in einem Umbrella-Header angezeigt wird, importieren Sie Ihre Datei wie folgt:

#import "MyFile.h"

und nicht als #import <MyFramework/MyFile.h>.


2

Ich bin auch auf dieses Problem gestoßen und dachte ursprünglich, es sei ein CocoaPods-Problem, aber es war ein Problem in den Einstellungen zum Erstellen von Apps, bei denen jemand (wahrscheinlich ich) ${PODS_ROOT}in den Header- recursiveSuchpfaden festgelegt und es als Suche festgelegt hat. Auf diese Weise konnten Header gefunden werden, die beim Erstellen der App nicht verwendet werden sollten. Sobald ich dies eingestellt hatte, war non-recursivealles in Ordnung. Die Verwendung der recursiveSuche ist ein schrecklicher Hack, um die richtigen Header zu finden. Lektion gelernt.


Ich kann bestätigen, dass dies auch mein Problem war.
Wilson Muñoz

Ich hatte dieses Problem mit PersonalizedAdConsent und dies hat es behoben. Vielen Dank!
Steven Elliott

1

Das war ein nerviges Problem für mich. In meinem speziellen Fall schienen keine Vorschläge zu helfen, da ich die "nicht modularen" Header in meine individuelle Datei-Header-Datei aufnehmen musste. Ich habe den Importaufruf in die Präfix-Header-Datei gesteckt.


0

Nachdem ich die obigen Lösungen überprüft hatte, verschob ich den Umbrella-Header an den unteren Rand der Header-Liste, und das funktionierte in Xcode 9.3.


0

Ich habe es gelöst, indem ich den ModulesOrdner aus dem Framework entfernt habe.

  • Navigieren Sie mit dem Finder zu Ihrem Framework-Speicherort, der im App-Projekt vorhanden ist

  • Gehen Sie in den Test.frameworkOrdner (im obigen Fall CoreLibrary.framework) und löschen Sie den ModulesOrdner.

  • Bereinigen und neu erstellen Die App wird das Problem lösen.


0

In meinem Fall habe ich vergessen, die Dateien .h und .m im Abschnitt "s.source_files" der .podspecs-Datei hinzuzufügen.

nach dem Hinzufügen funktioniert es gut.

Geben Sie hier die Bildbeschreibung ein


0

versuche @import FrameworkNamestatt#import "FrameworkName.h"


-5

Ich konnte Dutzende dieser Fehler mit Git Clean beheben. Hier ist der Befehl: git clean -dffx && git reset --hard

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.