Incluye encabezado no modular dentro del módulo marco

143

Estoy usando Xcode 6,

1) En primer lugar, estoy creando una biblioteca dinámica (CoreLibrary). Esta biblioteca contiene el archivo RequestPoster.h.

2) Luego creé un Cocoa Touch Framework y agregué esta biblioteca dinámica (CoreLibrary).

3) Luego, este marco se agrega a mi proyecto y da error en el archivo RequestPoster.h (CoreLibrary).

Error: Incluir un encabezado no modular dentro de la clase de módulo de marco:

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

Estos archivos no se encuentran en el proyecto.

Dev
fuente

Respuestas:

190

Intente ir a Configuración de compilación en "Destino" y establezca "Permitir inclusiones no modulares en módulos de estructura" en SÍ.

La verdadera respuesta es que el propietario de la biblioteca debe cambiar la ubicación de las importaciones. Esos archivos ifaddrs.h, arpa / inet.h, sys / types.h se están importando en un archivo .h en un marco, que a Xcode no le gusta. El responsable de la biblioteca debe moverlos a un archivo .m. Consulte, por ejemplo, este problema en GitHub, donde AFNetworking solucionó el mismo problema: https://github.com/AFNetworking/AFNetworking/issues/2205

bcattle
fuente
2
En caso de que el encabezado con error esté usando un tipo de los encabezados importados, ¿qué se recomienda? Por ejemplo, si el encabezado module.h en el módulo declara una función que toma un parámetro de tipo ifaddrs, están obligados a importar ifaddrs.h.
Ayush Goel
Pero, ¿y si son sistemas incluidos /usr/include/libproc.h?
Ben Leggiero
3
¿Podría explicar cuál es el impacto del cambio: Permitir
inclusiones
Creo que tal vez la mejor respuesta implicaría convertirlo en un encabezado modular, en lugar de silenciar básicamente este error. Puedo imaginar fácilmente a Apple quitando la opción de permitir encabezados no modulares en un módulo.
Ben Leggiero
170

Asegúrese de que los archivos de encabezado estén disponibles públicamente como parte de los encabezados públicos del marco.

Goto Framework -> Target -> Build Fases y arrastre para mover los archivos de encabezado relevantes de Project a Public. ¡Espero que ayude!

Captura de pantalla

Long Pham
fuente
3
Eso me ayudó a incluir el código de Objective C en un marco Swift, ¡gracias!
Vadim
1
También puede hacer este cambio a Membresía objetivo de Proyecto a Público en su archivo utilizando la ventana Inspector de archivos a la derecha de la pantalla principal de XCode.
Pigpocket
Si importa la biblioteca en una combinación de swift / objc, debe asegurarse de que el encabezado de puente también sea público. ¡Error que cometí!
Nick H247
74

Puede establecer Permitir inclusiones no modulares en Módulos marco en Configuración de compilación para el objetivo afectado en SÍ. Esta es la configuración de compilación que necesita editar:

Elemento de configuración de compilación que necesita editar

NOTA : debe utilizar esta función para descubrir el error subyacente, que con frecuencia se debe a la duplicación de las inclusiones globales entre corchetes en los archivos con alguna relación dependiente, es decir:

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

Si establecer Permitir inclusiones no modulares en Módulos de trama en da como resultado un conjunto de errores "X es una referencia ambigua" o algo por el estilo, debería poder rastrear los duplicados infractores y eliminarlos. Una vez que haya limpiado su código, establezca Permitir inclusiones no modulares en Módulos de trama nuevamente en NO .

revprez
fuente
1
Ok, ¡fueron los corchetes los que causaron el problema! Tuve este problema con una importación de CocoaPods y lo arreglé cambiando la importación para usar comillas en lugar de corchetes angulares.
Michael Forrest
Vaya, no, no lo hizo. Descubrí que estaba roto después de limpiar mi proyecto: - /
Michael Forrest
2
No puedo encontrar ninguna advertencia de "referencia ambigua". ¿Cuáles son los inconvenientes de dejarlo configurado en ?
Nicolas Miari
28

Tuve el mismo problema y lo resolví simplemente haciendo público el archivo de encabezado. [problema]

Si está trabajando en múltiples módulos en su proyecto. Luego, su archivo de encabezado debe ser público para ser utilizado en otras partes de los proyectos. Lo que necesita es seleccionar ese archivo de encabezado y en la vista de Utilidades del proyecto. Cambie el archivo de Proyecto / Privado a Público. Ver imagen a continuación:

Cambiar el alcance del archivo de encabezado

Saad
fuente
Esto sucede en particular cuando duplica un encabezado público existente, la membresía del encabezado duplicado se cambia a "proyecto"
Jeremie
no, no es obligatorio para la duplicación. Puede ocurrir debido a diferentes casos, por ejemplo, si importa algún proyecto como biblioteca por completo en su proyecto y luego intenta modificar las clases privadas. Conoce el archivo de encabezado y lo escribe, pero el acceso no es público para todos los proyectos.
Saad
23

"Incluir encabezado no modular dentro del módulo marco"

Cuando obtiene este error, la solución en algunas circunstancias puede ser simplemente marcar el archivo que está intentando importar como "público" en el inspector de archivos "Membresía de destino". El valor predeterminado es "Proyecto", y cuando se configura de esta manera puede causar este error. Ese fue el caso conmigo cuando intenté importar los encabezados de Google Analytic en un marco, por ejemplo.

John Bushnell
fuente
Esta respuesta me ayudó mucho en mi problema similar. No sabía que los archivos de encabezado de marco se pueden agregar al destino. En proyectos de aplicación, los encabezados nunca son parte de un objetivo.
bio
20

En realidad, una forma más fácil de solucionar esto es mover la #importdeclaración a la parte superior del .marchivo (en lugar de tenerla en su .harchivo de encabezado). De esta manera, no se quejará de que incluye un archivo de encabezado no modular. Tenía este problema por el que Allow non-module includesestablece en YESno trabajo para mí, por lo que al moverlo al archivo de implementación, se detuvo en las protestas. De hecho, esta es la forma preferida de importar e incluir archivos de encabezado de todos modos. Una vez que hayas hecho esto, volver a configurar esto NOdebería funcionar.

Idealmente, deberíamos tratar de aspirar a Allow non-module includesestablecerlo NO. Establecer esto YESen la mayoría de los casos significa que estás haciendo algo mal. La configuración se traduce como "Permitir la importación de archivos de encabezado aleatorio en el disco que de otro modo no forman parte del módulo". Esto se aplica a muy pocos casos de uso en la práctica, por lo que esta configuración siempre debe ser NO(es decir, el valor predeterminado).

tiempos extraños
fuente
10

En caso de que esté desarrollando su propio marco:

¿Por qué está pasando esto?

Si alguno de los archivos de encabezado públicos que ha mencionado en su module.modulemap tiene declaraciones de importación que no son mencionan en modulemap, esto le dará el error. Como intenta importar algún encabezado que no se declara como modular (en module.modulemap), rompe la modularidad del marco.

¿Cómo puedo arreglarlo?

¡Solo incluya el encabezado que le dio el error a su module.modulemap y vuelva a compilar!

¿POR QUÉ NO simplemente establecer permitir no modular a SÍ?

Porque no es realmente una solución aquí, con eso le dices a tu proyecto "se suponía que este marco era modular pero no lo es. Úselo de alguna manera, no me importa". Esto no soluciona el problema de modularidad de su biblioteca.

Para obtener más información, consulte esta publicación de blog o consulte los documentos de clang .

Mert Celik
fuente
cómo lo configuró el module.modulemap con el marco de proyectos de cacao, traté de permitir que mi biblioteca pueda trabajar con proyectos solo de Swift, pero debido a que una dependencia de la biblioteca, el módulo.modulemap no funciona, el cocoapod es autogenerando el mapa de módulo, pero parece que no funciona, ¿te has enfrentado a algo similar?
Amadeu Cavalcante Filho
8

Si necesita esto para los objetivos de CocoaPods, agregue estas líneas en 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
k06a
fuente
7

Allow Non-modular Includes in Framework Modulessolo funciona en código objc. No funciona a la velocidad.

Después de un período de investigación, descubrí que swift puede pasar el parámetro de advertencia a clang, así OTHER_SWIFT_FLAGSque -Xcc -Wno-error=non-modular-include-in-framework-moduleconfigúrelo para inhibir el error de importación de swift.

solo para alguien que tiene el mismo problema

SolaWing
fuente
6

Tuve el mismo problema y nada de lo anterior me ayudó. Así que espero que mi respuesta sea útil para alguien. En mi caso, el problema estaba en la configuración ALWAYS_SEARCH_USER_PATHS. Cuando se estableció en NO, el proyecto se construyó y funcionó bien. Pero en la medida en que uno de los pod requirió que se estableciera en YES, recibí un error

Incluye encabezado no modular dentro del módulo marco

Después de un par de tazas de café y todo el día investigando, descubrí que de acuerdo con los problemas conocidos de Xcode 7.1 Beta 2, notas de la versión :

• Si obtiene un error que indica "Incluir encabezado no modular dentro del módulo de marco" para un marco que se compiló previamente, asegúrese de que la configuración de compilación "Buscar siempre rutas de usuario" esté establecida en "No". El valor predeterminado es "Sí" solo por motivos heredados. (22784786)

Sin embargo, estaba usando XCode 7.3, pero parece que este error aún no se ha solucionado.

iyuna
fuente
6

el mismo problema se vuelve loco. Finalmente, encuentro que poner la 'importación xxx.h' en la implementación en lugar de la interfaz puede solucionar el problema. Y si usa Cocoapods para administrar su proyecto, puede agregar

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

en su archivo 'xxx.podspec'.

贺彦文
fuente
6

Si ve este error en un encabezado general al crear un marco dinámico , asegúrese de importar su archivo como:

#import "MyFile.h"

y no como #import <MyFramework/MyFile.h>.

Misha Karpenko
fuente
2

También me encontré con este problema y originalmente pensé que era un problema de CocoaPods, pero era un problema en la configuración de compilación de aplicaciones donde alguien (probablemente yo) había establecido ${PODS_ROOT}en Rutas de búsqueda de encabezado y lo configuró para que fuera una recursivebúsqueda. Esto le permitía encontrar encabezados que no estaban destinados a ser utilizados al compilar la aplicación. Una vez que configuré esto para usar, non-recursivetodo estuvo bien. usar la recursivebúsqueda es un truco terrible para tratar de encontrar los encabezados adecuados. Lección aprendida.

ucangetit
fuente
Puedo confirmar que este también fue mi problema.
Wilson Muñoz
Tuve este problema con PersonalizedAdConsent y esto lo solucionó. ¡Gracias!
Steven Elliott
1

Este fue un tipo de problema molesto para mí. Ninguna sugerencia pareció ayudar a mi caso particular, ya que necesitaba incluir los encabezados "no modulares" en mi archivo de encabezado de archivo individual. La solución que usé fue pegar la llamada de importación en el archivo de encabezado de prefijo.

Greg
fuente
0

Terminé moviendo el Umbrella Header al final de la lista de Headers después de verificar las soluciones anteriores, y eso funcionó en Xcode 9.3.

alfwatt
fuente
0

Lo resolví eliminando la Modulescarpeta del marco.

  • Navegue hasta su ubicación de marco que está presente en el Proyecto de aplicación utilizando el buscador

  • Vaya dentro de la Test.frameworkcarpeta (en el caso anterior será CoreLibrary.framework) y elimine la Modulescarpeta.

  • Limpie y vuelva a compilar la aplicación, resolverá el problema.

Vittal Pai
fuente
0

En mi caso, olvidé agregar el archivo .h y .m en la sección "s.source_files" del archivo .podspecs.

después de agregar esto, funciona bien.

ingrese la descripción de la imagen aquí

Muhammad Ahmed Baig
fuente
0

intente en @import FrameworkNamelugar de#import "FrameworkName.h"

Ke Yang
fuente
-5

Pude eliminar docenas de estos errores usando Git clean. Aquí está el comando: git clean -dffx && git reset --hard

Matt Bearson
fuente