Include intestazione non modulare all'interno del modulo framework


143

Sto usando Xcode 6,

1) In primo luogo sto creando una libreria dinamica (CoreLibrary). Questa libreria contiene il file RequestPoster.h.

2) Quindi creo un Cocoa Touch Framework e ho aggiunto questa libreria dinamica (CoreLibrary).

3) Quindi questo framework viene aggiunto al mio progetto e genera un errore nel file RequestPoster.h (CoreLibrary).

Errore: inclusione dell'intestazione non modulare all'interno della classe del modulo framework:

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

Questi file non sono stati trovati nel progetto.

Risposte:


190

Prova a creare Impostazioni sotto "Destinazione" e imposta "Consenti inclusioni non modulari nei moduli quadro" su SÌ.

La vera risposta è che la posizione delle importazioni deve essere modificata dal proprietario della biblioteca. Quei file ifaddrs.h, arpa / inet.h, sys / types.h vengono importati in un file .h in un framework, a cui Xcode non piace. Il manutentore della libreria dovrebbe spostarli in un file .m. Vedi ad esempio questo problema su GitHub, dove AFNetworking ha risolto lo stesso problema: https://github.com/AFNetworking/AFNetworking/issues/2205


2
Nel caso in cui l'intestazione con errore stia utilizzando un tipo dalle intestazioni importate, cosa si consiglia? Ad esempio, se l'intestazione module.h nel modulo dichiara una funzione che accetta un parametro di tipo ifaddrs, sono tenuti ad importare ifaddrs.h.
Ayush Goel,

Ma cosa succede se sono inclusi nel sistema /usr/include/libproc.h?
Ben Leggiero,

3
Potresti spiegare qual è l'impatto del cambiamento: Consenti inclusioni non modulari nei moduli quadro
nr5

Penso che forse la risposta migliore implicherebbe renderla un'intestazione modulare, piuttosto che mettere a tacere sostanzialmente questo errore. Posso facilmente immaginare che Apple rimuova l'opzione per consentire intestazioni non modulari in un modulo.
Ben Leggiero,

170

Assicurarsi che i file di intestazione siano disponibili pubblicamente come parte delle intestazioni pubbliche del framework.

Vai a Framework -> Target -> Crea fasi e trascina per spostare i file di intestazione pertinenti da Progetto a Pubblico. Spero che aiuti!

Immagine dello schermo


3
Ciò mi ha aiutato a includere il codice Objective C in un framework Swift, grazie!
Vadim,

1
Puoi anche apportare questa modifica a Target Membership da Progetto a Pubblico nel tuo file utilizzando la finestra di Controllo file a destra della schermata principale di XCode.
Pigpocket

Se si importa la libreria in un mix di swift / objc, è necessario assicurarsi che anche l'intestazione del bridge sia pubblica. Errore che ho fatto!
Nick H247,

74

È possibile impostare Consenti inclusioni non modulari in Moduli quadro in Impostazioni di costruzione per la destinazione interessata su SÌ. Questa è l'impostazione di costruzione che devi modificare:

Crea impostazioni oggetto che devi modificare

NOTA : è necessario utilizzare questa funzione per scoprire l'errore sottostante, che ho riscontrato essere frequentemente causato dalla duplicazione delle inclusioni globali tra parentesi angolari nei file con una relazione dipendente, ad esempio:

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

Se l'impostazione Consenti inclusioni non modulari in Moduli frame su comporta una serie di errori "X è un riferimento ambiguo" o qualcosa del genere, dovresti essere in grado di rintracciare i duplicati offensivi ed eliminarli. Dopo aver ripulito il codice, impostare Consenti inclusioni non modulari nei moduli frame su NO .


1
Ok, sono state le parentesi angolari a causare il problema! Ho riscontrato questo problema con un'importazione CocoaPods e l'ho risolto modificando l'importazione in modo da utilizzare le virgolette anziché le parentesi angolari.
Michael Forrest,

Oops, no non l'ha fatto. Ho scoperto che si era rotto dopo aver pulito il mio progetto: - /
Michael Forrest il

2
Non riesco a trovare alcun avviso di "riferimento ambiguo". Quali sono gli svantaggi di lasciarlo impostato su ?
Nicolas Miari,

28

Ho avuto lo stesso problema e risolverlo semplicemente rendendo pubblico il file header. [problema]

Se stai lavorando su più moduli nel tuo progetto. Quindi il file di intestazione deve essere pubblico per essere utilizzato in altre parti dei progetti. Ciò di cui hai bisogno è selezionare quel file di intestazione e nella vista Utilità del progetto. Cambia il file da Progetto / Privato a Pubblico. Vedi l'immagine sotto:

Modifica dell'ambito del file di intestazione


Ciò accade in particolare quando si duplica un'intestazione pubblica esistente, l'appartenenza all'intestazione duplicata viene modificata in "progetto"
Jeremie,

no non è obbligatorio per la duplicazione. Può verificarsi a causa di casi diversi, ad esempio se si importa completamente un progetto come libreria nel progetto e si tenta di modificare le classi private. Conosci il file header e lo scrivi ma l'accesso non è pubblico a tutti i progetti.
Saad,

23

"Includi intestazione non modulare all'interno del modulo framework"

Quando viene visualizzato questo errore, in alcune circostanze la soluzione può essere quella di contrassegnare semplicemente il file che si sta tentando di importare come "pubblico" nella finestra di ispezione dei file "Appartenenza target". L'impostazione predefinita è "Progetto" e, se impostato in questo modo, può causare questo errore. Questo è stato il mio caso quando ho provato ad importare le intestazioni di Google Analytic in un framework, ad esempio.


Questa risposta mi ha aiutato molto nel mio problema simile. Non sapevo che i file di intestazione del framework possano essere aggiunti alla destinazione. Nei progetti applicativi, le intestazioni non fanno mai parte di un target.
bio

20

In realtà un modo più semplice per risolvere questo problema è spostare l' #importistruzione nella parte superiore del .mfile (invece di averla nel .hfile di intestazione). In questo modo non si lamenterà che include un file di intestazione non modulare. Ho avuto questo problema in cui Allow non-module includesimpostata YESfatto non lavoro per me, quindi spostandolo al file di implementazione, è smesso di lamentarsi. Questo è in effetti il ​​modo preferito di importare e includere comunque i file header. Una volta fatto questo, ripristinarlo NOdovrebbe funzionare.

Idealmente dovremmo cercare di puntare Allow non-module includesa NO. Impostarlo su YESnella maggior parte dei casi significa che stai facendo qualcosa di sbagliato. L'impostazione si traduce in "Consenti importazione di file di intestazione casuali su disco che non fanno altrimenti parte del modulo". Questo si applica a pochissimi casi d'uso in pratica, quindi questa impostazione dovrebbe essere sempre NO(cioè il valore predefinito).


10

Nel caso in cui stai sviluppando il tuo framework:

Perché sta succedendo?

Se uno qualsiasi dei file di intestazione pubblici che hai citato nella tua module.modulemap ha dichiarazioni di importazione che non sono menzionate nella modulemap, questo ti darà l'errore. Poiché tenta di importare alcune intestazioni che non sono dichiarate come modulari (in module.modulemap), interrompe la modularità del framework.

Come posso ripararlo?

Includi semplicemente l'intestazione che ha dato l'errore a module.modulemap e ricompila!

PERCHÉ NON impostare semplicemente Consenti non modulare su SÌ?

Perché non è davvero una soluzione qui, con ciò dici al tuo progetto "questo framework doveva essere modulare ma non lo è. Usalo in qualche modo, non mi interessa". Questo non risolve il problema di modularità della tua libreria.

Per ulteriori informazioni, consulta questo post sul blog o fai riferimento ai documenti di Clang .


come hai impostato module.modulemap con il framework dei progetti di cacao, ho provato a lasciare che la mia libreria fosse in grado di funzionare con progetti solo Swift, ma poiché una dipendenza della libreria, module.modulemap non funziona, il cocoapod è generare automaticamente la modulemap, ma sembra non funzionare, hai affrontato qualcosa di simile?
Amadeu Cavalcante Filho

8

Se ne hai bisogno per i target CocoaPods aggiungi queste righe 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 Modulesfunziona solo in codice objc. non funziona in fretta.

Dopo un periodo di ricerche, ho scoperto che swift può passare il parametro di avviso a clang, quindi imposta OTHER_SWIFT_FLAGSper -Xcc -Wno-error=non-modular-include-in-framework-moduleinibire l'errore di importazione rapida.

solo per qualcuno che ha lo stesso problema


6

Ho avuto lo stesso problema e niente dall'alto mi ha aiutato. Quindi spero che la mia risposta sia utile per qualcuno. Nel mio caso il problema riguardava l'impostazione ALWAYS_SEARCH_USER_PATHS. Quando è stato impostato su NO, il progetto è stato creato e funzionava bene. Ma per quanto uno dei pod richiedesse che fosse impostato su SÌ stavo ricevendo un errore

Include intestazione non modulare all'interno del modulo framework

Dopo un paio di tazze di caffè e ricerche per tutto il giorno, ho scoperto che, in base ai problemi noti delle note di rilascio di Xcode 7.1 Beta 2 :

• Se viene visualizzato un errore che indica "Includi intestazione non modulare all'interno del modulo framework" per un framework precedentemente compilato, assicurarsi che l'impostazione di build "Cerca sempre percorsi utente" sia impostata su "No". L'impostazione predefinita è "Sì" solo per motivi legacy. (22784786)

Stavo usando XCode 7.3, ma sembra che questo errore non sia stato ancora corretto.


6

lo stesso problema rende pazzo.Infine, trovo che l'importazione 'xxxxx' nell'implementazione invece dell'interfaccia possa risolvere il problema. E se usi Cocoapods per gestire il tuo progetto. Puoi aggiungere

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

nel tuo file "xxx.podspec".


6

Se viene visualizzato questo errore nell'intestazione di un ombrello durante la creazione di un framework dinamico , assicurarsi di importare il file come:

#import "MyFile.h"

e non come #import <MyFramework/MyFile.h>.


2

Mi sono imbattuto anche in questo problema e inizialmente pensavo che fosse un problema di CocoaPods, ma era un problema nelle impostazioni di creazione delle app in cui qualcuno (probabilmente io) aveva impostato ${PODS_ROOT}nei percorsi di ricerca dell'intestazione e impostato come recursivericerca. Ciò le consentiva di trovare le intestazioni che non erano destinate a essere utilizzate durante la creazione dell'app. Una volta impostato questo per utilizzare non-recursivetutto andava bene. usare la recursivericerca è un trucco terribile per cercare di trovare le intestazioni appropriate. Lezione imparata.


Posso confermare che anche questo è stato un mio problema.
Wilson Muñoz,

Ho avuto questo problema con PersonalizedAdConsent e questo è stato risolto. Grazie!
Steven Elliott,

1

Questa è stata una specie di problema fastidioso per me. Nessun suggerimento sembrava aiutare il mio caso particolare, poiché avevo bisogno di includere le intestazioni "non modulari" nel mio file di intestazione del singolo file. Il lavoro che ho usato è stato incollare la chiamata di importazione nel file di intestazione del prefisso.


0

Ho finito per spostare l'header dell'ombrello in fondo all'elenco degli header dopo aver verificato le soluzioni di cui sopra, e ha funzionato in Xcode 9.3.


0

L'ho risolto rimuovendo la Modulescartella dal framework.

  • Passare alla posizione del framework che è presente nel progetto app utilizzando finder

  • Vai all'interno della Test.frameworkcartella (nel caso precedente sarà CoreLibrary.framework) & Elimina Modulescartella.

  • Clean and Re Build the app, risolverà il problema.


0

Nel mio caso ho dimenticato di aggiungere il file .h e .m nella sezione "file_source" del file .podspecs.

dopo averlo aggiunto, funziona bene.

inserisci qui la descrizione dell'immagine


0

prova @import FrameworkNameinvece di#import "FrameworkName.h"


-5

Sono stato in grado di eliminare dozzine di questi errori utilizzando Git clean. Ecco il comando: git clean -dffx && git reset --hard

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.