Ahora me gustaría migrar mi marco ObjC a Swift y recibí el siguiente error:
include of non-modular header inside framework module 'SOGraphDB'
Las referencias son a un archivo de encabezado que solo define un protocolo y yo uso este archivo de encabezado en algunas clases para usar este protocolo.
Parece estar relacionado con la función del módulo, pero por el momento no está muy claro cómo solucionarlo, ¿conoce una solución?
ACTUALIZAR:
Este es un error del compilador Swift.
ACTUALIZACIÓN 2:
Una solución rápida (pero no resolver la causa raíz) es establecer la siguiente configuración en sí: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES
objective-c
frameworks
swift
Stephan
fuente
fuente
Respuestas:
¿Tu encabezado es público?
Seleccione el archivo de encabezado en el explorador de proyectos. Luego, en la sección de la derecha en xcode, notará que hay un menú desplegable junto al objetivo. Cambie eso de "proyecto" a "público". Esto funcionó para mí.
fuente
Este es un comportamiento esperado del compilador y por una muy buena razón.
Creo que la mayoría de las personas que se encuentran con estos problemas se deben a que cambian de
Application Target
unaFramework Target
y comienzan a agregar encabezados C y Objective C en el encabezado general del marco esperando que tenga el mismo comportamiento que el Encabezado de puente de la aplicación , que se comporta de manera diferente. El encabezado general está diseñado para un marco obj-c mixto rápido y su propósito es exponer las API al mundo exterior que su marco tiene en el objetivo-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 exponga los encabezados de Objective-C / C que no son parte de su marco al código rápido de su marco. Porque en ese caso, estos encabezados también estarán expuestos como parte de nuestro módulo marco al mundo exterior, que a menudo no es lo que queremos hacer, ya que rompe la modularidad. (Y esa es exactamente la razón por la cual la opción No incluye modular incluye en los módulos de marco el valor predeterminado es NO )
Para exponer la biblioteca Objective-C / C a su código swift marco, debemos definir un módulo swift separado para dicha biblioteca. Entonces
import YourLegacyLibrary
se puede usar un swift estándar .Permítanme demostrar esto en un escenario típico: incrustarlo
libxml2
en nuestro marco.1. Primero debe crear un
module.modulemap
archivo que se vea de esta manera:Para el marco OSX:
Para el marco de iOS:
Todo lo que hace es envolver el encabezado y cualquier otro encabezado al que haga referencia dentro del módulo swift, para que swift pueda generar los enlaces rápidos para estas interfaces C.
2. Luego, en el directorio del 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 encabezado4. En Configuración de compilación , agregue
$(SRCROOT)/SwiftLibXML2
a Importar rutas5. En la pestaña General del proyecto , agregue
libxml2.tbd
a Marcos vinculados y Bibliotecas .Ahora importa este módulo donde sea necesario con:
(si desea buscar un módulo más completo, ejemplo de mapa, sugeriría hacer referencia al módulo de módulo de Darwin en
/usr/include/module.modulemap
, necesitaría tener instaladas las herramientas de línea de comandos de Xcode para ir allí, referencia Falta / usr / incluir en OS X El Capitan )fuente
module.map
está en desuso, debemodule.modulemap
cambiarse deimport SwiftLibXML2
en Objective-C? ¡Gracias!Aquí se explica cómo aplicar automáticamente la solución rápida para que no tenga que cambiar
Pods.xcodeproj
manualmente después de cada unopod install
.Agregue este fragmento al final de su Podfile:
fuente
La solución para mí fue ir a destino-> configuración de compilación-> Permitir inclusiones no modulares en los Módulos de Framework ¡cambie a SÍ!
fuente
Creo que lo solucioné. Tengo un código modelo que usa sqlite3 en un marco. En mi caso, el culpable fue <sqlite3.h>.
El problema era que en mi encabezado Module / Module.h, importé un encabezado público que importó <sqlite3.h>. La solución fue ocultar todos los tipos sqlite3_xxx y asegurarse de que no fueran visibles en ningún público .h. Todas las referencias directas a sqlite3 se hicieron privadas o visibilidad del proyecto. Por ejemplo, tenía un singleton público que tenía algunos punteros sqlite3_stmt colgando de él. Los moví a una clase separada que ahora es solo una declaración hacia adelante 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é.
fuente
En Swift :
1. Modifique la configuración de compilación de su proyecto Xcode y objetivos como se menciona a continuación:
Permitir inclusiones no modulares en módulos de estructura: no
Habilitar código de bits: sí
2. Use la última versión actual disponible para GoogleMaps iOS SDK (use CocoaPods para obtenerlo):
GoogleMaps (1.10.4)
3. Comente la importación problemática:
4. Cree o modifique su archivo de encabezado de puente, agregando la importación problemática:
[Su nombre de proyecto Xcode] -Bridging-Header.h
5. Limpie y reconstruya su proyecto Xcode.
fuente
Esta respuesta está desactualizada.
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 de la carpeta "Encabezados" del marco en la ruta de los encabezados públicos.
El compilador Swift utiliza esta información para generar un mapa de símbolos no mutilados junto con su información de tipo asociada.
fuente
No
Hacer
fuente
El archivo de encabezado se asignó al destino, pero solo se marcó como proyecto visible, solo un cambio en público condujo a la resolución de este error.
fuente
Sé que esta es una vieja pregunta, pero 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
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 lanzamiento :
Sin embargo, estaba usando XCode 7.3, pero parece que este error aún no se ha solucionado.
fuente
Cambiar la configuración de compilación> Permitir inclusiones no modulares en los módulos de marco a SÍ resolvió el mismo problema para mí.
fuente
También me gustaría agregar mi experiencia con el problema.
Solo para resumir:
Aquí están mis 2 adiciones a las respuestas anteriores:
<framework/headerName.h>
, sino solo así"headerName.h"
, el problema desaparece.Probé esta última, y hasta ahora no he experimentado este problema, sin embargo, sospecho que esta solución es válida solo si ha aplicado algunas de las respuestas principales (nota: no todas son compatibles entre sí, por ejemplo , el enfoque del módulo y la posibilidad de encabezado no modular incluye).
fuente
Tuve este problema exacto al incluir mi propio marco en un proyecto. Se solucionó colocando todas las importaciones de sqlite3.h en archivos .m no en archivos públicos .h. Supongo que otras bibliotecas pueden marcar problemas similares con Xcode.
fuente
Tuve el problema específico con Facebook 4.02 sdk y FBSDKCoreKit.
Hice todos los pasos pero aún error sobre el encabezado no modular. Arrastro y suelto solo el encabezado específico del marco para construir fases-> sección de encabezado.
Luego, creó automáticamente una copia del encabezado en el navegador de proyectos en la parte superior.
Lo eliminé de las fases de compilación -> encabezado y eliminé el nuevo archivo y funcionó bien.
Como reseteado o algo así.
fuente
En mi caso (Xcode 9 beta 6 - Swift 4 - usando Cocoapods) esto se resolvió cuando he eliminado Podfile.lock y vainas directorio y corrí
pod install
de nuevofuente
Tengo 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 "encabezado no modular dentro del módulo marco". Cuando abrí el mismo proyecto en otra versión de XCode (versión 9.0.1) el error no apareció.
fuente
Lo más común es que este error sea causado por la respuesta elegida, sin embargo, este error apareció una vez por accidente al arrastrar archivos de marco a mi nueva carpeta de proyecto. Hice clic para eliminar los marcos, pero accidentalmente presioné para 'Eliminar referencia' a los marcos en lugar de eliminar realmente los archivos por completo. En este punto, si abría mi carpeta de proyectos en Finder, veía archivos como 'CoreLocation' y 'AudioToolbox' allí. Eliminar estos archivos de la carpeta del proyecto y limpiar el proyecto solucionó el problema.
fuente
Después de permitir importar las inclusiones no modulares, puede intentar importar ese módulo utilizando el encabezado de Objective-C Bridging:
fuente
Lo resolví eliminando la
Modules
carpeta 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.framework
carpeta (en el caso anterior seráSOGraphDB.framework
) y elimine laModules
carpeta.Limpie y vuelva a compilar la aplicación, resolverá el problema.
fuente
Tuve este problema al importar el marco Parse. La única forma en que pude solucionarlo fue descartar todos mis cambios desde mi último commit (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.
fuente