Swift Framework: encabezado de paraguas '[…] .h' no encontrado

114

En un marco personalizado que contiene código Objective-C y Swift , el compilador Swift arroja el siguiente error:

[build_path]/unextended-module.modulemap:2:19: error: umbrella header 'bugtest.h' not found
  umbrella header "bugtest.h"
                  ^
<unknown>:0: error: could not build Objective-C module 'bugtest'
Tim Bodeit
fuente

Respuestas:

240

Esto suele suceder después de un cambio de nombre de proyecto o algo así. El problema es que el encabezado general ya no aparece como encabezado público . Consulte la imagen adjunta para ver cómo solucionar este problema.

Reparar

arturgrigor
fuente
7
Solo una nota para los futuros lectores de que para ver la sección 'Encabezados' de 'Fases de construcción', debe hacer clic en un objetivo de Pod. El destino de la aplicación principal no incluirá una sección de 'Encabezados'.
shmim
3
Esto lo arregló totalmente. Gracias. Esta debería ser la respuesta aprobada.
Gujamin
16
Para mí, el nivel de acceso era público, pero también falla en el paraguas no encontrado. Moví la sección "Encabezados" de las "Fases de construcción" a la parte superior y comenzó a funcionar.
Aleksei Minaev
6
El encabezado de mi paraguas ya era público. Mover la sección a la parte superior tampoco ayudó.
Rafael Bugajewski
1
Estaba teniendo un problema similar cuando Carthage actualizó uno de mis frameworks importados. Supongo que XCode está teniendo problemas para vigilar los cambios en la ruta del marco de referencia. El reinicio simple de XCode solucionó el problema.
Tony
48

En Xcode 7 Beta, con Swift 2, también sucederá si su Framework Header no se declara como "Público"

Por ejemplo, tenía un Cocoa Touch Framework con una visibilidad de "Proyecto" para el archivo de encabezado, y el error "Encabezado de paraguas ... no encontrado" para todos los archivos Swift en mi proyecto, una vez que tenía el encabezado "Público", el el error se fue

Claude Houle
fuente
1
En mi caso, cuando encontré este problema, esta respuesta parecía la respuesta "más correcta", y funcionó para mí.
greymouser
1
Estoy de acuerdo. Esta es la respuesta correcta. Compruebe que el archivo <proyecto> .h tenga la membresía de destino y el nivel de acceso correctos (público).
user965972
@ Shadow_x99 ¿cómo configuro el encabezado como "Público"? Mi pregunta está publicada en stackoverflow.com/questions/36084291/…
user2727195
Esta es en realidad una variación de la respuesta de @ arturgrigor, excepto que Xcode realiza el cambio en sí. El resultado final debería ser el mismo.
original_username
40

Hay 4 formas diferentes en que esto puede suceder, ignorando errores en versiones anteriores de Xcode

  • No tienes un encabezado general llamado $ (TARGET_NAME) .h en tu proyecto
  • Tiene un encabezado de paraguas, pero no está configurado como público. Ver la respuesta de arturgrigor
  • DEFINES_MODULE no está configurado para YES
  • CLANG_ENABLE_MODULES no está configurado para YES
Claus Jørgensen
fuente
3
Una quinta causa que acabo de encontrar: umbrella_header.h en sí mismo no debe verificarse en ningún objetivo (como Info.plist)
nalexn
3
Tengo todo configurado correctamente en esta lista, pero falla.
Erik Aigner
25

Esto sucederá cuando la Always Search User Pathsconfiguración esté habilitada para el objetivo de Framework.

Configurarlo en Noresolverá ese error.

En mi humilde opinión, esto es un error en el compilador Swift y he presentado un radar con Apple.
Ver rdar: // 21038443

Tim Bodeit
fuente
1
¡Gracias! Este es el que también me atrapó.
Chris Hatton
Esto funcionó para mí. Un síntoma adicional es que falló inmediatamente después de una limpieza, pero tuvo éxito si lo intentó sin limpiar.
Ben Leggiero
18

Para mí, el nivel de acceso era público, pero también falla en el paraguas no encontrado. Moví la sección "Encabezados" de las "Fases de construcción" a la parte superior y comenzó a funcionar. Secuencia de comandos para podfile:

post_install do |installer|
installer.pods_project.targets.each do |target|
    phase_name = 'Headers'
    target.build_phases.each do |phase|
        if (phase.display_name.include? phase_name)
            target.build_phases.unshift(phase).uniq! unless target.build_phases.first == phase
        end
    end
end

No tengo ni idea de por qué está sucediendo. Probé proyectos ficticios, pero no sucedió. Solo en los grandes con múltiples dependencias. Algo con la compilación ANTES de copiar los encabezados de paraguas.

Aleksei Minaev
fuente
4
Mover "Encabezados" encima de "Compilar fuentes" funcionó para mí. xCode 8.2.1.
Rob Paterson
Mover la fase de encabezados a la parte superior también funcionó para mí.
Søren Mortensen
PodfileArchivo no válido : error de sintaxis, final de entrada inesperado, esperando keyword_end.
Volodymyr Kulyk
13

Definitivamente debes establecer tu marco en público:

ingrese la descripción de la imagen aquí

Bartłomiej Semańczyk
fuente
1
Funciona perfectamente. ¡Muchas gracias!
kkiermasz
¿Cuál es el contexto de esa captura de pantalla? ¿En qué haces clic para llegar allí?
pkamb
7

Para mí, configurar 'Usar mapas de encabezado' en 'NO' resolvió el problema

xySVerma
fuente
… Y en mi caso, ponerlo en SÍ solucionó el problema. Desafortunadamente, no parece haber ninguna documentación sobre esta configuración, pero sí es el valor predeterminado y no estoy seguro de por qué se estableció en no para uno de mis objetivos.
robotspacer
7

Una solución más: después de cambiar el nombre de una carpeta, es posible que la ubicación anterior aún aparezca en el archivo del proyecto para el archivo .h, incluso si actualizó la ubicación a través de la barra lateral de Xcode. Esta antigua ubicación provoca el error de encabezado de paraguas.

Solución simple: elimine la referencia al archivo .h y vuelva a agregar. (¡y luego recuerde hacerlo público nuevamente!)

Danra
fuente
5

Descubrí que con New Swift Build System y Parallelize Build activados, obtendría errores como en esta pregunta. La solución fue vincular a los marcos que se habían importado en los archivos fuente rápidos. (Creo que anteriormente la aplicación se compilaba porque simplemente sucedió que los marcos estaban vinculados a algo creado previamente en la cola de compilación en serie).

Escribí un script para revisar todas las importaciones en todos los destinos en un espacio de trabajo y asegurarme de que sus marcos se hayan vinculado en ese destino.

https://github.com/Jon889/SwiftImportChecker

Jonathan.
fuente
4

Aquí ya hay algunas respuestas excelentes. @ Shadow_x99 fue muy útil. Sin embargo, si se me permitiera complementar con mi propia experiencia.

Un encabezado general se identifica automáticamente en el proceso de construcción. No se especifica en la configuración de compilación del destino ni se hereda de la configuración del proyecto.

Entonces, para evitar este error, a partir de XCode 7 , es el siguiente;

warning: no umbrella header found for target 'MyTarget', module map will not be generated

deben tomarse dos pasos importantes.

En primer lugar, el encabezado general debe tener el mismo nombre que el objetivo . Entonces, si su objetivo es un marco llamado MyTarget, debe haber un encabezado llamado MyTarget.h.

En segundo lugar, en las fases de compilación MyTarget, como se menciona en esa respuesta, ese archivo de encabezado debe aparecer en la sección pública como se detalla anteriormente.

Max MacLeod
fuente
1

Tuve el mismo problema y ninguna de las respuestas sugeridas ayudó en mi caso, así que dejo esto aquí en caso de que alguien tenga el mismo problema.

Había agregado un "Ejecutar secuencia de comandos" en "Fases de compilación" pero terminé eliminándolo y fue entonces cuando comencé a recibir el error.

Mi solución terminó teniendo que limpiar el proyecto, reconstruir mi marco y luego mi proyecto de aplicación se construyó correctamente.

Ana Figueira
fuente
1

En mi experiencia, debe elegir en los objetivos el marco que le está dando el error, no el objetivo del proyecto.
Luego compile, y después de compilarlo estará disponible en el objetivo del proyecto.

Eironeia
fuente
0

Si está utilizando Xcode 7.1 y CocoaPods 0.39, parece haber un cambio rápido en el compilador que afecta a algunos CocoaPods (Nimble, Quick, etc.) Pruebe algunas de las soluciones especificadas en este hilo: https://github.com/ CocoaPods / CocoaPods / issues / 4420 sin embargo, si ninguno de ellos funciona, intente usar Xcode 7.0.1 o 7.2 beta. Puede obtener ambos aquí: https://developer.apple.com/downloads/ .

Editar: En mi caso, para solucionar el problema, también tuve que degradar CocoaPods a 0.38.2.

Edición posterior: parece no estar relacionado con Xcode 7.1. Simplemente degradar CocoaPods a 0.38.2 debería ayudar:

sudo gem uninstall cocoapods -v 0.39
sudo gem install cocoapods -v 0.38.2
Marius
fuente
Gracias @Marius Ursache. Siguiendo sus instrucciones resolvió el problema por mí.
Vick Swift
0

Su archivo de encabezado debe estar en la sección [Fases de compilación / Encabezados / Público].

Si su archivo de encabezado ya está en la sección [Build Phases / Headers / Public], muchas veces hacer lo siguiente resolvió mi problema:

  1. limpiar el proyecto
  2. mover el archivo de encabezado a la sección "privada" o "proyecto"
  3. mover el archivo de encabezado a la sección "pública"
  4. reconstruir todo de nuevo
Andrei A.
fuente
Vaya, esta es la única que funcionó entre estas docenas de respuestas y parece que sería la menos probable, ¡gracias!
Paolo
0

Resolví esto cambiando el nombre de mi module.modulemap a moduleXYZ.modulemap y cambiando el nombre del archivo modulemap en la configuración del proyecto

retterdesapok
fuente
0

En mi caso, acabo de construir el marco específico con su esquema. Y luego reconstruir todo el proyecto y resolvió el problema

Hudi Ilfeld
fuente
0

asegúrese de que las "rutas de importación" en la configuración de compilación incluyen el archivo que está intentando incluir ...

Pequeño vigilante
fuente
-1

Elimina estos archivos del directorio del proyecto. .xcworkspace pods/ypodfile.lock

actualice el pod y cree el proyecto.

Subhash
fuente
-1

Lo arreglé haciendo que el Modo de compilación de la configuración de compilación del marco problemático sea Incremental.

Ghislain Leblanc
fuente
-1

En mi caso, el problema fue causado por eliminar el script de encabezados en Build Phases

function removeHeaders() {  
    find $BUILD_ROOT/...  -name '*.h' -exec rm -f {} \;  
}  
removeHeaders

Eliminar este script solucionó el problema.

phnmnn
fuente
-2

Ninguna de las 9 respuestas me ayudó, así que intenté crear un nuevo proyecto que pudiera enviar a Apple para presentar un error. Me sorprendió no poder reproducir el problema. Revisé la configuración de compilación y eran equivalentes. Aparentemente, esto es una especie de error.

Si nada más ayuda , intente crear un nuevo proyecto e importe al menos algunas clases Objective C y Swift de su proyecto actual, compare la configuración de compilación relacionada con el marco con los valores predeterminados del nuevo proyecto y, finalmente, mueva todos los archivos al nuevo proyecto.

Rafael Bugajewski
fuente
-2

He estado trabajando en eso durante todo un día, pero vale la pena. Intenté todas las formas aquí, pero no lo resolví. Creé un nuevo proyecto, un experimento, y descubrí que la ruta de búsqueda del encabezado del usuario estaba configurada como $ {SRCROOT} recursiva , y la cambié a $ {SRCROOT} no recursiva , cambié la ruta del encabezado de puente (por ejemplo, #import "SVProgressHUD.h" -> #import "Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h"), la el error desapareció.

ShengBo.Cai
fuente