objective-c - with - xcode add bridging header file




Swift-Compiler-Fehler: "nicht-modularer Header innerhalb des Framework-Moduls" (12)

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.

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 Lösung für mich war, auf Ziel zu gehen-> Build-Einstellungen-> Nicht-modulare Includes erlauben in Framework-Module wechseln zu JA!


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.


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


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 weiß, dass dies eine alte Frage ist, aber ich hatte das gleiche Problem und nichts von oben hat mir geholfen. Also hoffe ich, dass meine Antwort für jemanden hilfreich sein wird. In meinem Fall war das Problem in der Einstellung ALWAYS_SEARCH_USER_PATHS. Als es auf NO gesetzt wurde, baute und arbeitete ok. Aber wenn einer der Pods auf YES gesetzt war, bekam ich einen Fehler

Einschließen eines nicht modularen Headers innerhalb des Framework-Moduls

Nach ein paar Tassen Kaffee und ganztägiger Recherche fand ich heraus, dass nach bekannten Problemen von Xcode 7.1 Beta 2 Release Notes :

• Wenn Sie die Fehlermeldung "Include of nicht-modular header inframework module" für ein zuvor kompiliertes Framework erhalten, vergewissern Sie sich, dass die Erstellungseinstellung "Always Search User Paths" auf "No" gesetzt ist. Der Standardwert ist nur aus Legacy-Gründen "Ja". (22784786)

Ich habe zwar XCode 7.3 benutzt, aber dieser Bug ist noch nicht behoben.


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.


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.


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.


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

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.





swift