Jetzt möchte ich mein ObjC-Framework auf Swift migrieren und habe den folgenden Fehler erhalten:
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.
Ist anscheinend mit der Modulfunktion verbunden, aber es ist im Moment nicht ganz klar, wie man das Problem behebt. Kennen Sie eine Lösung?
AKTUALISIEREN:
Dies ist ein Swift-Compilerfehler.
UPDATE 2:
Eine schnelle Lösung (aber keine Lösung der Grundursache) besteht darin, die folgende Einstellung auf yes zu setzen: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
objective-c
frameworks
swift
Stephan
quelle
quelle
Antworten:
Ist Ihr Header öffentlich?
Wählen Sie die Header-Datei im Projektexplorer aus. Dann werden Sie im Abschnitt rechts in xcode feststellen, dass sich neben dem Ziel ein Dropdown befindet. Ändern Sie das von "Projekt" in "öffentlich". Das hat bei mir funktioniert.
quelle
Dies ist ein erwartetes Compilerverhalten und das aus einem sehr guten Grund.
Ich denke , dass die Mehrheit der Menschen in diese Probleme laufen verursacht wird , nachdem sie von Schalter
Application Target
zuFramework Target
und starten Sie das Hinzufügen C und Objective - C - Header in Rahmen des Umbrella - Header erwartet , dass es ein gleiches Verhalten wie haben Anwendung Bridging - Header , das unterschiedlich verhält. Der Umbrella-Header ist eigentlich für ein gemischtes schnelles obj-c-Framework vorgesehen und dient dazu, die APIs der Außenwelt auszusetzen, die Ihr Framework in Ziel-c oder c hat. Das bedeutet, dass die Header, die wir dort platzieren, im öffentlichen Bereich sein sollten.Es sollte nicht als Ort verwendet werden, an dem Objective-C / C-Header, die nicht Teil Ihres Frameworks sind, für den schnellen Code Ihres Frameworks verfügbar gemacht werden. Denn in diesem Fall werden diese Header auch als Teil unseres Framework-Moduls der Außenwelt ausgesetzt, was wir oft nicht wollen, da es die Modularität bricht. (Und genau aus diesem Grund ist die Standardeinstellung für nicht modulare Einschlüsse in Framework-Modulen standardmäßig NO. )
Um die Objective-C / C-Bibliothek für Ihren Framework-Swift-Code verfügbar zu machen, sollten Sie ein separates Swift-Modul für diese Bibliothek definieren. Dann kann ein Standard-Swift
import YourLegacyLibrary
verwendet werden.Lassen Sie mich dies anhand eines typischen Szenarios demonstrieren: Einbettung
libxml2
in unser Framework.1. Sie müssen zuerst eine
module.modulemap
Datei erstellen , die folgendermaßen aussieht:Für das OSX-Framework:
Für iOS-Framework:
Alles, was es tut, ist, dass es den Header und alle anderen Header, auf die es verweist, innerhalb des Swift-Moduls einschließt, so dass Swift dann die Swift-Bindungen für diese C-Schnittstellen generieren kann.
2. Erstellen Sie dann in Ihrem xcode-Projektverzeichnis einen Ordner
SwiftLibXML2
und legen Sie diese module.modulemap dort ab3. In Build - Einstellungen , fügen Sie
$(SDKROOT)/usr/include/libxml2
auf Header - Suchpfade4. In Build - Einstellungen hinzufügen,
$(SRCROOT)/SwiftLibXML2
um Import - Pfade5. Unter Project Allgemein Registerkarte hinzufügen ,
libxml2.tbd
um Linked Frameworks und Bibliotheken .Jetzt importieren Sie dieses Modul bei Bedarf mit:
(Wenn Sie sich ein vollständigeres Beispiel für module.map ansehen möchten, würde ich vorschlagen, auf Darwins module.modulemap zu verweisen. Dazu
/usr/include/module.modulemap
müssen Xcode-Befehlszeilentools installiert sein. Verweisen Sie auf Missing / usr / include in OS X El Capitan )quelle
module.map
ist veraltet, er sollte inmodule.modulemap
clang.llvm.org/docs/Modules.html#attributesimport SwiftLibXML2
in Objective-C? Vielen Dank!Hier erfahren Sie, wie Sie die Schnellkorrektur automatisch anwenden, damit Sie sie nicht
Pods.xcodeproj
nach jedem manuell ändern müssenpod install
.Fügen Sie dieses Snippet am Ende Ihrer Poddatei hinzu:
quelle
Die Lösung für mich bestand darin, auf Ziel-> Build-Einstellungen-> Nicht-modulare Includes in Framework-Modulen zulassen auf YES umzuschalten!
quelle
Ich glaube, ich habe das umgangen. 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 Module / Module.h-Header einen öffentlichen Header importierte, der <sqlite3.h> importierte. Die Lösung bestand darin, alle sqlite3_xxx-Typen auszublenden und sicherzustellen, dass sie in keiner öffentlichen .h-Datei sichtbar sind. Alle direkten Verweise auf sqlite3 wurden privat oder projektsichtbar gemacht. Zum Beispiel hatte ich einen öffentlichen Singleton, an dem einige sqlite3_stmt-Zeiger hingen. 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 Framework als auch im abhängigen Projekt festzulegen. Diese Problemumgehung war notwendig, obwohl ich nicht sicher bin, warum.
quelle
In Swift :
1. Ändern Sie die Build-Einstellungen Ihres Xcode-Projekts und Ihrer Ziele wie folgt:
Nicht modulare Einschlüsse in Framework-Modulen zulassen: Nein
Bitcode aktivieren: Ja
2. Verwenden Sie die aktuellste Version für GoogleMaps iOS SDK (verwenden Sie CocoaPods, um sie zu erhalten):
GoogleMaps (1.10.4)
3. Kommentieren Sie den problematischen Import:
4. Erstellen oder ändern Sie Ihre Bridging-Header-Datei und fügen Sie den problematischen Import hinzu:
[Ihr Xcode-Projektname] -Bridging-Header.h
5. Bereinigen Sie Ihr Xcode-Projekt und erstellen Sie es neu.
quelle
Diese Antwort ist veraltet.
Beim Importieren von Frameworks müssen Sie alle Header-Dateien importieren , die Abhängigkeiten mit dem Root-Header teilen. Der einfachste Weg, um sicherzustellen, dass dies immer funktioniert, besteht darin, alle Header im Ordner "Headers" des Frameworks in Ihren öffentlichen Headerpfad zu importieren.
Der Swift-Compiler verwendet diese Informationen, um eine Karte mit nicht entstellten Symbolen zusammen mit den zugehörigen Typinformationen zu generieren.
quelle
Tu es nicht
Machen
quelle
Die Header-Datei wurde dem Ziel zugewiesen, aber nur als sichtbares Projekt markiert. Nur eine Änderung der öffentlichen Datei führte zur Behebung dieses Fehlers.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich hatte das gleiche Problem und nichts von oben hat mir geholfen. 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 war, wurde es gebaut und funktionierte in Ordnung. Aber soweit einer der Pods die Einstellung auf JA erforderte, erhielt ich einen Fehler
Nach ein paar Tassen Kaffee und den ganzen Tag Recherche fand ich heraus, dass nach bekannten Problemen von Xcode 7.1 Beta 2 Versionshinweise :
Ich habe zwar XCode 7.3 verwendet, aber anscheinend wurde dieser Fehler noch nicht behoben.
quelle
Ändern der Build-Einstellungen> Nicht modulare Includes in Framework-Modulen auf YES zulassen ! löste das gleiche Problem für mich.
quelle
Ich möchte auch meine Erfahrungen mit dem Problem hinzufügen.
Nur um es zusammenzufassen:
Hier sind meine 2 Ergänzungen zu den obigen Antworten:
<framework/headerName.h>
, sondern nur so"headerName.h"
.Ich habe das letzte Mal versucht, und bis jetzt habe ich dieses Problem nicht mehr erlebt. Ich vermute jedoch, dass diese Lösung nur gültig ist, wenn Sie einige der wichtigsten Antworten angewendet haben (Hinweis: Sie sind beispielsweise nicht alle miteinander kompatibel , der Modulansatz und das Zulassen von nicht modularen Headern beinhaltet).
quelle
Ich hatte genau dieses Problem, als ich mein eigenes Framework in ein Projekt einbezog. Es wurde behoben, indem alle Importe von sqlite3.h in .m-Dateien abgelegt wurden, die nicht in öffentlichen .h-Dateien enthalten waren. Ich gehe davon aus, dass andere Bibliotheken ähnliche Probleme mit Xcode melden.
quelle
Ich hatte das spezielle Problem mit Facebook 4.02 SDK und FBSDKCoreKit.
Ich habe alle Schritte ausgeführt, aber immer noch Fehler bezüglich nicht modularer Header. Ich ziehe und lasse nur den spezifischen Header aus dem Framework, um Phasen-> Header-Abschnitt zu erstellen.
Anschließend wurde 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 gut funktioniert.
Wie es zurückgesetzt oder so.
quelle
In meinem Fall (Xcode 9 Beta 6 - Swift 4 - mit Cocoapods) wurde dies behoben, als ich Podfile.lock und das Pods- Verzeichnis löschte und
pod install
erneut ausführtequelle
Ich habe dieses Problem nach dem Aktualisieren eines Projekts von swift2 auf swift3. Ich habe XCode 8.3.2 verwendet, um den Code zu aktualisieren, und konnte den Fehler "Nicht modularer Header im Framework-Modul" nicht beseitigen. Als ich dasselbe Projekt in einer anderen Version von XCode (Version 9.0.1) geöffnet habe, ist der Fehler nicht aufgetreten.
quelle
Am häufigsten wird dieser Fehler durch die gewählte Antwort verursacht. Dieser Fehler wurde jedoch versehentlich einmal beim Ziehen von Framework-Dateien in meinen neuen Projektordner angezeigt. Ich habe geklickt, um die Frameworks zu löschen, aber versehentlich gedrückt, um nur den Verweis auf die Frameworks zu entfernen, anstatt die Dateien tatsächlich vollständig zu löschen. Wenn ich zu diesem Zeitpunkt meinen Projektordner im Finder öffnete, sah ich dort Dateien wie 'CoreLocation' und 'AudioToolbox'. Das Löschen dieser Dateien aus dem Projektordner und das Bereinigen des Projekts haben das Problem behoben.
quelle
Nachdem Sie das Importieren nicht modularer Includes zugelassen haben, können Sie versuchen, dieses Modul mithilfe des Objective-C Bridging-Headers zu importieren:
quelle
Ich habe es gelöst, indem ich den
Modules
Ordner 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.framework
Ordner (im obigen FallSOGraphDB.framework
) und löschen Sie denModules
Ordner.Bereinigen und neu erstellen Die App wird das Problem lösen.
quelle
Ich hatte dieses Problem beim Importieren des Parse-Frameworks. Die einzige Möglichkeit, dies zu beheben, bestand darin, alle meine Änderungen seit meinem letzten Commit zu verwerfen (das Löschen des Frameworks und das Bereinigen des Projekts funktionierten nicht) und Parse (nach einem erneuten Download des SDK) mit den anderen erforderlichen Frameworks erneut hinzuzufügen.
quelle