objective c with Swift-Compiler-Fehler: "nicht-modularer Header innerhalb des Framework-Moduls"




xcode add bridging header file (15)

Jetzt möchte ich mein ObjC-Framework zu Swift migrieren und habe folgenden Fehler:

include of non-modular header inside framework module 'SOGraphDB'

Die Verweise beziehen sich auf eine Header-Datei, die nur ein Protokoll definiert, und ich verwende diese Header-Datei in einigen Klassen, um dieses Protokoll zu verwenden.

Das scheint mit dem Modul-Feature zu tun zu haben, aber es ist im Moment nicht ganz klar, wie man es beheben kann, weißt du eine Lösung?

AKTUALISIEREN:

Dies ist ein Swift-Compilerfehler.

UPDATE 2:

Eine schnelle Lösung (ohne die Ursache zu beheben) besteht darin, die folgende Einstellung auf yes zu setzen: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES


Die Header-Datei wurde dem Ziel zugewiesen, wurde aber nur als sichtbares Projekt markiert, nur eine Änderung an der öffentlichen Führung zur Lösung dieses Fehlers.


Nicht

#import "MyOtherFramework.h"

Machen

#import <MyOtherFramework/MyOtherFramework.h>

Ist dein Header öffentlich?

Wählen Sie die Header-Datei im Projekt-Explorer. Dann werden Sie im Abschnitt rechts in xcode feststellen, dass neben dem Ziel ein Dropdown-Menü erscheint. Ändere das von "Projekt" in "öffentlich". Das hat für mich funktioniert.


In meinem Fall (Xcode 9 Beta 6 - Swift 4 - mit Cocoapods) wurde dies gelöst, als ich Podfile.lock und das Pods- Verzeichnis löschte und pod install erneut startete


In Swift :

1. Ändern Sie Ihr Xcode-Projekt und die Build-Einstellungen der Ziele wie folgt:

Nicht-modulare Includes in Framework-Modulen zulassen: Nein

Bitcode aktivieren: Ja

2. Verwenden Sie die aktuellste Version, die für das GoogleMaps iOS SDK verfügbar ist (verwenden Sie CocoaPods, um es zu erhalten):

GoogleMaps (1.10.4)

3. Kommentieren Sie den problematischen Import:

//import GoogleMaps

4. Erstellen oder ändern Sie Ihre Bridging-Header-Datei und fügen Sie den problematischen Import hinzu:

[Ihr Xcode-Projektname] -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. Reinigen und bauen Sie Ihr Xcode-Projekt neu auf.


Meistens wird dieser Fehler durch die gewählte Antwort verursacht, aber ich hatte diesen Fehler einmal zufällig beim Ziehen von Framework-Dateien in meinen neuen Projektordner. Ich habe geklickt, um die Frameworks zu löschen, habe aber aus Versehen lediglich gedrückt, um nur Remove Reference zu den Frameworks zu löschen, anstatt die Dateien tatsächlich vollständig zu löschen. An diesem Punkt, als ich meinen Projektordner im Finder öffnete, sah ich dort Dateien wie 'CoreLocation' und 'AudioToolbox'. Durch das Löschen dieser Dateien aus dem Projektordner und das Bereinigen des Projekts wurde das Problem behoben.


Ich möchte meine Erfahrung mit dem Problem auch hinzufügen.

Nur um zusammenzufassen:

  • @ Ambientlights Antwort ist großartig und behebt die meisten Probleme.
  • Nicht-modulare Header zuzulassen ist eine andere Lösung (siehe einige Antworten oben)
  • Markieren Sie die Header des Frameworks als public (nur das, was Sie enthüllen wollen) und importieren Sie diese in den Schirmkopf
  • Hier sind meine 2 Ergänzungen zu der Antwort
  • Überprüfen Sie sorgfältig die Importe in Ihrem Projekt auf Header, die Ihre Frameworks direkt in sie importieren (statt wenn Vorwärtsdeklaration verwenden, wenn möglich), ist es keine gute Praxis, eine Headerdatei in eine andere Headerdatei aufzunehmen, manchmal verursacht dies ein Problem, denn wenn nicht richtig durchgeführt, kann dies dazu führen, dass mehrere Header- und Linker-Probleme mehrfach enthalten sind
  • und schließlich nachdem ich all das oben getan habe, stieß ich immer noch auf diesen Fehler, also grub ich ein wenig mehr und fand (in Apple Entwicklerforen, aber den Link verloren :(), dass wenn man die Header in den Schirmkopf nicht aufnimmt wie dieses <framework/headerName.h> , aber nur so "headerName.h" , das Problem "headerName.h" , ich habe es versucht und für jetzt habe ich dieses Problem nicht mehr erlebt, aber ich denke, dass diese Lösung nur dann gültig ist, wenn Sie haben einige der besten Antworten angewendet (sie sind nicht alle miteinander kompatibel, z. B. der Modulansatz und das Zulassen von nicht modularen Header-Includes)

ZUSATZ: Überprüfen Sie die Architekturen der Bibliothek und die des Ziels, mit dem Sie es verknüpfen möchten


Nachdem Sie nicht modulare Includes importiert haben, können Sie versuchen, dieses Modul mit dem Objective-C Bridging-Header zu importieren:

#import <YandexMobileMetrica/YandexMobileMetrica.h>

Ich hatte das spezifische Problem mit Facebook 4.02 SDK und FBSDKCoreKit.

Ich habe alle Schritte, aber immer noch Fehler über nicht modulare Header. Ich ziehe nur den spezifischen Header aus dem Framework, um phases-> header-Abschnitt zu erstellen.

Dann automatisch eine Kopie der Kopfzeile im Projektnavigator oben erstellt.

Ich habe es aus den Build-Phasen -> Header entfernt und die neue Datei gelöscht und hat gut funktioniert.

Wie es zurückgesetzt oder so etwas.


Diese Antwort ist veraltet.

Wenn Sie Frameworks importieren, müssen Sie alle Headerdateien importieren , die Abhängigkeiten mit dem Stammheader teilen. Der einfachste Weg, um sicherzustellen, dass dies immer funktioniert, besteht darin, alle Header im "Headers" -Ordner des Frameworks in Ihren öffentlichen Header-Pfad zu importieren.

Der Swift-Compiler verwendet diese Informationen zum Generieren einer Zuordnung von nicht verfälschten Symbolen zusammen mit den zugehörigen Typinformationen.


Ich habe dieses Problem nach der Aktualisierung eines Projekts von swift2 auf swift3 bekommen. Ich habe XCode 8.3.2 verwendet, um den Code zu aktualisieren und konnte den Fehler "nicht modularer Header innerhalb des Framework-Moduls" nicht loswerden. Wenn ich dasselbe Projekt in einer anderen Version von XCode (Version 9.0.1) öffnete, wurde der Fehler nicht angezeigt.


Ich hatte genau dieses Problem, als ich mein eigenes Framework in ein Projekt einfügte. Es wurde behoben, indem alle Importe von sqlite3.h in .m-Dateien nicht in öffentliche .h-Dateien eingefügt wurden. Ich nehme an, dass andere Bibliotheken ähnliche Probleme mit Xcode kennzeichnen können.


Ich hatte dieses Problem beim Importieren des Parse-Frameworks. Die einzige Möglichkeit, dies zu beheben, war, alle meine Änderungen seit dem letzten Commit zu verwerfen (einfach das Framework zu löschen und das Projekt zu bereinigen) und Parse (nach einem erneuten Download des SDK) mit seinen anderen erforderlichen Frameworks erneut hinzuzufügen.


So können Sie die Schnellkorrektur automatisch anwenden, sodass Sie Pods.xcodeproj nach jeder pod install manuell ändern Pods.xcodeproj .

Füge dieses Snippet am Ende deiner Poddatei hinzu:

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

Ich denke, dass ich das verstanden habe. Ich habe einen Modellcode, der sqlite3 in einem Framework verwendet. In meinem Fall war der Schuldige <sqlite3.h>.

Das Problem war, dass ich in meinem Header Module / Module.h einen öffentlichen Header importierte, der <sqlite3.h> importierte. Die Lösung bestand darin, alle sqlite3_xxx-Typen zu verbergen und sicherzustellen, dass sie in keiner öffentlichen .h sichtbar waren. Alle direkten Verweise auf sqlite3 wurden privat oder projektbezogen gemacht. Zum Beispiel hatte ich ein öffentliches Singleton, an dem einige sqlite3_stmt-Zeiger hängen blieben. Ich habe diese in eine separate Klasse verschoben, die jetzt nur eine Vorwärtsdeklaration in diesem öffentlichen Header ist. Jetzt kann ich bauen.

Die Einstellung CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES hat übrigens nicht funktioniert. Ich habe versucht, es sowohl im Rahmen als auch im abhängigen Projekt zu setzen. Diese Problemumgehung war notwendig, obwohl ich mir nicht sicher bin warum.







swift