objective c - how - Error del compilador Swift: "encabezado no modular dentro del módulo del marco"
swift in objective c (18)
¿Tu encabezado es público?
Seleccione el archivo de encabezado en el explorador del proyecto. Luego, en la sección de la derecha de xcode, verás que hay un menú desplegable al lado del objetivo. Cambia eso de "proyecto" a "público". Esto funcionó para mí.
Ahora me gustaría migrar mi marco ObjC a Swift y me aparece el siguiente error:
include of non-modular header inside framework module ''SOGraphDB''
Las referencias son a un archivo de cabecera que solo define un protocolo y yo uso este archivo de cabecera en algunas clases para usar este protocolo.
Parece estar relacionado con la función del módulo, pero por el momento no está del todo claro cómo solucionarlo, ¿conoces una solución?
ACTUALIZAR:
Este es un error del compilador Swift.
ACTUALIZACIÓN 2:
Una solución rápida (pero no para resolver la causa raíz) es establecer la siguiente configuración en sí: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
A continuación, le mostramos cómo aplicar automáticamente la solución rápida para que no tenga que cambiar Pods.xcodeproj
manualmente después de cada pod install
.
Agregue este fragmento al final de su Podfile:
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
Creo que supere esto. Tengo un código de modelo que usa sqlite3 en un marco. En mi caso, el culpable era <sqlite3.h>.
El problema fue que en mi encabezado Module / Module.h, importé un encabezado público que importaba <sqlite3.h>. La solución fue ocultar todos los tipos de sqlite3_xxx y asegurarse de que no estuvieran visibles en cualquier .h público. Todas las referencias directas a sqlite3 se hicieron privadas o visibilidad del proyecto. Por ejemplo, tuve un singleton público que tenía algunos apuntadores sqlite3_stmt colgando de él. Los moví a una clase separada que ahora es solo una declaración directa en ese encabezado público. Ahora puedo construir
Por cierto, la configuración CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES no funcionó. Intenté configurarlo tanto en el marco como en el proyecto dependiente. Esta solución fue necesaria, aunque no estoy seguro de por qué.
Después de permitir la importación de inclusiones no modulares, puede intentar importar ese módulo usando el encabezado Puente de Objective-C:
#import <YandexMobileMetrica/YandexMobileMetrica.h>
El archivo de encabezado se asignó al destino, pero solo se marcó como proyecto visible, solo un cambio en el público condujo a la resolución de este error.
En Swift :
1. Modifique su proyecto de Xcode y la configuración de compilación de los objetivos como se menciona a continuación:
Permitir inclusiones no modulares en módulos de framework: no
Habilitar código de bits: Sí
2. Utilice la última versión disponible para el SDK de Google Maps para iOS (use CocoaPods para obtenerla):
GoogleMaps (1.10.4)
3. Comenta la importación problemática:
//import GoogleMaps
4. Cree o modifique su archivo de encabezado de puente, agregando la importación problemática:
[Su nombre de proyecto Xcode] -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. Limpia y reconstruye tu proyecto de Xcode.
En mi caso (Xcode 9 beta 6 - Swift 4 - usando Cocoapods) esto fue resuelto cuando eliminé Podfile.lock y el directorio de Pods y ejecuté la pod install
nuevamente
Este es un comportamiento esperado del compilador y por una muy buena razón.
Creo que la mayoría de las personas que enfrentan este problema es causada después de cambiar de Application Target
a Framework Target
y comenzar a agregar C y Objective C en el encabezado general de Framework esperando que tenga el mismo comportamiento que Bridging Header , que se comporta de manera diferente. El encabezado del paraguas en realidad está designado para un marco mixto rápido obj-c y su propósito es exponer las API al mundo exterior que tiene su marco en Object-C o C. Eso significa que los encabezados que colocamos allí deben estar en el ámbito público.
No debe usarse como un lugar que expone los encabezados Objective-C / C que no forman parte de su marco de trabajo al código rápido de su infraestructura. Porque en ese caso, estos encabezados también estarán expuestos como la parte de nuestro módulo de framework al mundo exterior, que a menudo no es lo que queremos hacer ya que rompe la modularidad. (Y eso es exactamente por lo que permite que las inclusiones no modulares en los módulos del marco se establezcan como NO )
Para exponer la biblioteca Objective-C / C a su código swift de framework, debemos definir un módulo swift separado para dicha biblioteca. Luego se puede usar una import YourLegacyLibrary
estándar rápida import YourLegacyLibrary
.
Permítanme demostrar esto en un escenario típico: incrustación de libxml2
en nuestro framework.
1. Primero necesita crear un archivo module.modulemap
que se vería de esta manera:
Para el marco OSX:
module SwiftLibXML2 [system] {
header "/usr/include/libxml2/libxml/xpath.h"
export *
}
Para el marco de iOS:
module SwiftLibXML2 [system] {
header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h"
export *
}
Todo lo que hace es que envuelve el encabezado y cualquier otro encabezado al que hace referencia dentro del módulo veloz, para que Swift pueda generar los enlaces rápidos para estas interfaces C.
2. Luego, en su directorio de proyecto xcode, cree una carpeta SwiftLibXML2
y coloque este module.modulemap allí
3. En Configuración de compilación , agregue $(SDKROOT)/usr/include/libxml2
a las rutas de búsqueda de encabezado
4. En Configuraciones de compilación , agregue $(SRCROOT)/SwiftLibXML2
a Importar rutas
5. En la pestaña General del proyecto, agregue libxml2.tbd
a los marcos y bibliotecas vinculados .
Ahora importa este módulo donde sea necesario con:
import SwiftLibXML2
(Si desea ver un ejemplo más completo de module.map, le sugiero que haga referencia al módulo module.modulemap de Darwin en /usr/include/module.modulemap
, necesitará tener instaladas las herramientas de línea de comandos de Xcode para ir allí, referencia Missing / usr / include en OS X El Capitan )
La solución para mí fue ir a target-> build settings-> Permitir inclusiones no modulares en Framework Modules cambiar a YES!
Lo más común es que este error sea causado por la respuesta elegida, pero tuve este error una vez por accidente al arrastrar archivos de marcos a la nueva carpeta de proyectos. Hice clic para eliminar los marcos pero presioné accidentalmente para solo ''Eliminar referencia'' a los marcos en lugar de eliminar realmente los archivos por completo. En este punto, si abrí mi carpeta de proyecto en Finder, vi archivos como ''CoreLocation'' y ''AudioToolbox'' allí. Eliminar estos archivos de la carpeta del proyecto y limpiar el proyecto solucionó el problema.
Me gustaría agregar mi experiencia con el problema también.
Solo para resumir:
- La respuesta de @ambientlight es excelente y soluciona la mayoría de los problemas.
- permitir otras cabeceras no modulares es otra solución (ver algunas de las respuestas anteriores)
- marcando los encabezados del marco como públicos (solo el que desea exponer) e importándolos en el encabezado del paraguas
- aquí están mis 2 adiciones a la respuesta
- compruebe cuidadosamente las importaciones en su proyecto para los encabezados que importan sus marcos directamente en ellos (en lugar de usar declaración directa si es posible), no es una buena práctica incluir un archivo de encabezado en otro archivo de encabezado, a veces esto causa un problema, porque si no hecho correctamente, esto puede conducir a múltiples incluyendo un encabezado y problemas con el enlazador
- y finalmente, después de hacer todo lo anterior, seguí tropezando con ese error, así que cavé un poco más y encontré (en los foros de desarrolladores de Apple, pero perdí el enlace :(), que si incluyes los encabezados en el encabezado del paraguas no como este
<framework/headerName.h>
, pero solo como este"headerName.h"
, el problema desaparece, lo intenté y por ahora no he experimentado este problema, sin embargo, creo que esta solución solo es válida si Ha aplicado algunas de las principales respuestas (no todas son compatibles entre sí, por ejemplo, el enfoque de módulo y la posibilidad de encabezado no modular incluye)
ADICIÓN: compruebe las arquitecturas de la biblioteca y la del objetivo al que desea vincularlo
Obtuve este problema después de actualizar un proyecto de swift2 a swift3. Estaba usando XCode 8.3.2 para actualizar el código y no pude deshacerme del error "header no modular dentro del módulo framework". Cuando abrí el mismo proyecto en otra versión de XCode (versión 9.0.1) el error no apareció.
Sé que esta es una vieja pregunta, pero tuve el mismo problema y nada desde arriba 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 configuró para NO proyecto construido y funcionó bien. Pero en la medida en que uno de los pods requirió que se estableciera en SÍ, estaba recibiendo un error
Incluye un encabezado no modular dentro del módulo del marco
Después de tomar un par de tazas de café e investigar durante todo el día, descubrí que según los problemas conocidos de las notas de la versión Beta 2 de Xcode 7.1 :
• Si obtiene un error que indica "Incluir un encabezado no modular dentro del módulo de marco" para un marco que compiló previamente, asegúrese de que la configuración de compilación "Buscar siempre en las rutas de usuario" esté establecida en "No". El valor predeterminado es "Sí" solo por razones heredadas. (22784786)
Estaba usando XCode 7.3, pero parece que este error no se ha corregido todavía.
Tuve el problema específico con Facebook 4.02 sdk y FBSDKCoreKit.
Hice todos los pasos, pero todavía error sobre el encabezado no modular. Arrastro y solté solo el encabezado específico del marco para construir fases-> sección de encabezado.
A continuación, creó automáticamente una copia del encabezado en el navegador del proyecto en la parte superior.
Lo eliminé de las fases de compilación -> encabezado y eliminé el nuevo archivo y funcionó bien.
Como reseted o algo así.
Tuve este problema al importar el marco de Parse. La única forma de solucionarlo fue descartar todos mis cambios desde mi último compromiso (simplemente eliminar el marco y limpiar el proyecto no funcionó) y agregar Parse nuevamente (después de una nueva descarga del SDK) con sus otros marcos requeridos.
Tuve este problema exacto al incluir mi propio marco en un proyecto. Se corrigió colocando todas las importaciones de sqlite3.h en archivos .m que no están en archivos .h públicos. Asumo que otras bibliotecas pueden marcar problemas similares con Xcode.
Esta respuesta está pasada de moda.
Al importar marcos, debe importar todos los archivos de encabezado que comparten dependencias con el encabezado raíz. La forma más fácil de garantizar que esto siempre funcione es importar todos los encabezados en la carpeta "Encabezados" del marco en la ruta de los encabezados públicos.
El compilador Swift usa esta información para generar un mapa de símbolos no destrozados junto con su información de tipo asociada.
No lo hagas
#import "MyOtherFramework.h"
Hacer
#import <MyOtherFramework/MyOtherFramework.h>