Erro do compilador Swift: “header não modular dentro do módulo de estrutura”

Agora gostaria de migrar minha estrutura do ObjC para o Swift e recebi o seguinte erro:

include of non-modular header inside framework module 'SOGraphDB' 

As referências são para um arquivo de header que apenas define um protocolo e eu uso esse arquivo de header em algumas classs para usar esse protocolo.

É parece relacionado com o recurso de módulo, mas no momento não é muito claro como corrigir, você conhece uma solução?

ATUALIZAR:

Este é um erro do compilador Swift.

ATUALIZAÇÃO 2:

Uma solução rápida (mas não a causa raiz) é definir a seguinte configuração como yes: CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES

Seu header é público?

Selecione o arquivo de header no explorador do projeto. Então, na seção à direita no xcode, você notará que há um menu suspenso ao lado do alvo. Mude isso de “projeto” para “público”. Isso funcionou para mim.

cabeçalho público

Esse é um comportamento esperado do compilador e por um bom motivo.

Acho que a maioria das pessoas que enfrentam esses problemas é causada depois que eles mudam de Application Target para Framework Target e começam a adicionar headers C e Objective C no header da estrutura, esperando que ele tenha o mesmo comportamento do Bridging Header do aplicativo , que se comporta de maneira diferente. O header guarda-chuva é, na verdade, designado para framework misto swift, obj-c e sua finalidade é expor as APIs para o mundo externo que seu framework possui em objective-c ou c. Isso significa que os headers que colocamos lá deveriam estar no escopo público.

Ele não deve ser usado como um local que expõe headers de Objective-C / C que não fazem parte de sua estrutura ao código rápido de sua estrutura. Porque, nesse caso, esses headers também serão expostos como parte de nosso módulo de estrutura para o mundo externo, o que geralmente não é o que queremos fazer, uma vez que quebra a modularidade. (E é exatamente por isso que o padrão permite include não-modular nos módulos do Framework NÃO )

Para expor a biblioteca Objective-C / C ao seu código swift de framework, devemos definir um módulo swift separado para essa biblioteca. Em seguida, uma import YourLegacyLibrary rápida padrão import YourLegacyLibrary pode ser usada.

Deixe-me demonstrar isso em um cenário típico: incorporando libxml2 em nossa estrutura.

1. Você primeiro precisa criar um arquivo module.modulemap que seria assim:

Para a estrutura do OSX:

 module SwiftLibXML2 [system] { header "/usr/include/libxml2/libxml/xpath.h" export * } 

Para o framework iOS:

 module SwiftLibXML2 [system] { header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/libxml2/libxml/xpath.h" export * } 

Tudo o que isso faz é que ele encerra o header e quaisquer outros headers referenciados dentro do módulo swift, para que o swift possa gerar as ligações rápidas para essas interfaces C.

2. Em seguida, no diretório do projeto xcode, crie uma pasta SwiftLibXML2 e coloque este module.modulemap lá

3. Em Configurações de compilation , adicione $(SDKROOT)/usr/include/libxml2 aos caminhos de pesquisa de header

4. Em Configurações de compilation , adicione $(SRCROOT)/SwiftLibXML2 para importar caminhos

5. No separador Geral do Project, adicione libxml2.tbd a Linked Frameworks and Libraries .

Agora você importa este módulo quando necessário com:

 import SwiftLibXML2 

(Se você quiser olhar um exemplo de module.map mais completo, eu sugiro fazer referência ao module.modulemap de Darwin em /usr/include/module.modulemap , você precisaria ter as ferramentas de linha de comando Xcode instaladas para ir até lá, referenciando Missing / usr / include no OS X El Capitan )

Veja como aplicar automaticamente a correção rápida para que você não precise alterar o Pods.xcodeproj manualmente após cada pod install .

Adicione este trecho ao final do seu 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 

A solução para mim foi ir em target-> build settings-> Permitir inclusões não-modulares em Framework Switches para YES!

Eu acho que fiquei por aqui. Eu tenho algum código de modelo que usa o sqlite3 em um framework. No meu caso, o culpado era .

O problema era que no meu header Module / Module.h, eu importei um header público que importava . A solução foi esconder todos os tipos sqlite3_xxx e ter certeza de que eles não estavam visíveis em nenhum .h. Todas as referências diretas ao sqlite3 foram feitas com privacidade ou visibilidade do projeto. Por exemplo, eu tinha um singleton público que tinha alguns pointers sqlite3_stmt pendurados nele. Mudei-os para uma class separada que agora é apenas uma declaração de encaminhamento nesse header público. Agora eu posso construir.

Incidentalmente, a configuração CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES não funcionou. Eu tentei defini-lo tanto no framework quanto no projeto dependente. Essa solução alternativa foi necessária, embora eu não saiba por quê.

Em Swift :

1. Modifique seu projeto Xcode e defina as configurações de build conforme mencionado abaixo:

Permitir inclusões não-modulares nos módulos do Framework: não

Ativar Bitcode: Sim

2. Use a última versão atual disponível para o SDK do GoogleMaps para iOS (use CocoaPods para obtê-lo):

GoogleMaps (1.10.4)

3. Comente a importação problemática:

 //import GoogleMaps 

4. Crie ou modifique seu arquivo de header de bridging, adicionando a importação problemática:

[Nome do projeto do seu Xcode] -Bridging-Header.h

 // Use this file to import your target's public headers // that you would like to expose to Swift. #import  

5. Limpe e re-construa seu projeto Xcode.

Essa resposta está desatualizada.

Ao importar estruturas, você deve importar todos os arquivos de header que compartilham dependencies com o header raiz. A maneira mais fácil de garantir isso sempre é importar todos os headers da pasta “Cabeçalhos” da estrutura para o caminho de headers públicos.

insira a descrição da imagem aqui

O compilador Swift usa essas informações para gerar um mapa de símbolos não mutilados juntamente com suas informações de tipo associadas.

O arquivo de header foi alocado para o destino, mas só foi marcado como projeto visível, apenas uma mudança para a origem pública para a resolução desse erro.

Eu sei que esta é uma questão antiga, mas eu tive o mesmo problema e nada de cima me ajudou. Então espero que minha resposta seja útil para alguém. No meu caso, o problema estava na configuração ALWAYS_SEARCH_USER_PATHS. Quando foi definido para nenhum projeto construído e funcionou ok. Mas até onde um dos pods precisou ser configurado como SIM, recebi um erro

Inclusão de header não modular dentro do módulo de estrutura

Depois de algumas xícaras de café e durante todo o dia pesquisando, descobri que, de acordo com os problemas conhecidos das notas de lançamento do Xcode 7.1 Beta 2 :

• Se você receber um erro informando “Incluir header não modular dentro do módulo de estrutura” para uma estrutura previamente compilada, certifique-se de que a configuração de compilation “Sempre pesquisar caminhos de usuário” esteja definida como “Não”. O padrão é “Sim” apenas por motivos herdados. (22784786)

Eu estava usando o XCode 7.3, mas parece que esse bug ainda não foi corrigido.

Não faça

 #import "MyOtherFramework.h" 

Faz

 #import  

Eu tive esse problema exato ao include meu próprio framework em um projeto. Corrigido isso colocando todas as importações de sqlite3.h em arquivos .m não em .h. Estou assumindo que outras bibliotecas podem sinalizar problemas semelhantes com o Xcode.

Eu tive o problema específico com o Facebook 4.02 SDK e FBSDKCoreKit.

Eu fiz todos os passos, mas ainda erro sobre header não modular. Eu arrasto e solto apenas o header específico da estrutura para construir fases-> seção de header.

Em seguida, criou automaticamente uma cópia do header no navegador do projeto, na parte superior.

Eu removi-o das fases de compilation -> header e excluí o novo arquivo e funcionou bem.

Como se tivesse sido resetado ou algo assim.

Eu gostaria de adicionar minha experiência com o problema também.

Apenas para resumir:

  • @ A resposta do ambientlight é ótima e corrige a maioria dos problemas.
  • permitir headers não-modulares é outra solução (veja algumas das respostas acima)
  • marcando os headers do framework como públicos (apenas o que você deseja expor) e importando-os no header do guarda-chuva
  • aqui estão minhas duas adições à resposta
  • cuidadosamente verificar as importações em seu projeto para headers que importam suas estruturas diretamente neles (em vez disso, se estiver usando declaração de encaminhamento, se possível), não é uma boa prática include um arquivo de header em outro arquivo de header, às vezes isso causa um problema, porque se não feito corretamente isso pode levar a vários incluindo um dos problemas de header e linker
  • e, finalmente, depois de fazer todos os itens acima, eu continuei batendo no erro, então eu cavei um pouco mais e descobri (nos fóruns de desenvolvedores da Apple, mas perdi o link :(), que se você include os headers no header guarda-chuva não como este , mas apenas como este "headerName.h" , o problema desaparece, eu tentei isso e por enquanto eu não tenho mais esse problema, no entanto eu acho que esta solução é válida apenas se Você aplicou algumas das principais respostas (elas não são todas compatíveis umas com as outras, por exemplo, a abordagem do módulo e a inclusão de headers não modulares)

ADIÇÃO: verifique as arquiteturas da biblioteca e do destino ao qual deseja vinculá-lo

Mais comumente esse erro é causado pela resposta escolhida, mas eu tive esse erro aparecer uma vez por acidente ao arrastar arquivos de estrutura para minha nova pasta de projeto. Cliquei para excluir as estruturas, mas acidentalmente pressionei apenas ‘Remove Reference’ para as estruturas, em vez de excluir os arquivos completamente. Neste ponto, se eu abri a pasta do meu projeto no Finder, vi arquivos como ‘CoreLocation’ e ‘AudioToolbox’. A exclusão desses arquivos da pasta do projeto e a limpeza do projeto corrigiram o problema.

Depois de permitir a importação de inclusões não modulares, você poderia tentar importar esse módulo usando o header Objective-C Bridging:

 #import  

No meu caso (Xcode 9 beta 6 – Swift 4 – usando Cocoapods) isso foi resolvido quando eu excluí Podfile.lock e o diretório Pods e executei a pod install novamente

Eu tenho esse problema depois de atualizar um projeto de swift2 para swift3. Eu estava usando o XCode 8.3.2 para atualizar o código e não consegui me livrar do erro “header não-modular dentro do módulo framework”. Quando abri o mesmo projeto em outra versão do XCode (versão 9.0.1), o erro não apareceu.

Alternar configurações de compilation> Permitir inclusões não modulares nos Módulos do Framework para SIM! resolvi o mesmo problema para mim.

Eu tive esse problema ao importar o framework Parse. A única maneira que eu poderia consertá-lo foi descartar todas as minhas alterações desde o meu último commit (simplesmente excluindo a estrutura e limpando o projeto não funcionou) e adicionar o Parse novamente (após um novo download do SDK) com suas outras estruturas necessárias.