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

Estou usando o Xcode 6,

1) Em primeiro lugar estou criando uma biblioteca dinâmica (CoreLibrary). Esta biblioteca contém o arquivo RequestPoster.h.

2) Em seguida, criei um Cocoa Touch Framework e adicionei essa biblioteca dinâmica (CoreLibrary).

3) Então este framework é adicionado no meu projeto e dá erro no arquivo RequestPoster.h (CoreLibrary).

Erro: inclusão de header não modular dentro da class do módulo de estrutura:

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

Este arquivo não encontrado no projeto.

Tente ir Configurações de construção em “Destino” e defina “Permitir inclusões não modulares em módulos de estrutura” como SIM.

A resposta real é que a localização das importações precisa ser alterada pelo proprietário da biblioteca. Esses arquivos ifaddrs.h, arpa / inet.h, sys / types.h estão sendo importados em um arquivo .h em um framework, que o Xcode não gosta. O mantenedor da biblioteca deve movê-los para um arquivo .m. Veja por exemplo este problema no GitHub, onde o AFNetworking corrigiu o mesmo problema: https://github.com/AFNetworking/AFNetworking/issues/2205

Verifique se os arquivos de header estão disponíveis publicamente como parte dos headers públicos da estrutura.

Goto Framework -> Target -> Build Phases e arraste para mover os arquivos de header relevantes de Project para Public. Espero que ajude!

Screenshot

Você pode definir Permitir inclusões não-modulares em Módulos do Framework em Configurações de Compilação para o destino afetado como SIM. Esta é a configuração de construção que você precisa editar:

Criar configurações do item que você precisa editar

OBSERVAÇÃO : você deve usar esse recurso para descobrir o erro subjacente, que eu descobri ser frequentemente causado pela duplicação de inclusões globais com colchetes angulares em arquivos com algum relacionamento dependente, ou seja:

 #import  // referred to in two or more dependent files 

Se a configuração Permitir inclusões não-modulares em Módulos de Estrutura para resultados YES em um conjunto de erros “X é uma referência ambígua” ou algo do tipo, você deve ser capaz de rastrear a (s) duplicata (s) ofensiva (s) e eliminá-las. Depois de limpar seu código, defina Permitir inclusões não-modulares em módulos de quadro de volta como NÃO .

Eu tive o mesmo problema e resolvi isso apenas tornando o arquivo de header público. [problema]

Se você estiver trabalhando em vários módulos em seu projeto. Em seguida, seu arquivo de header precisa ser público para ser usado em outras partes de projetos. O que você precisa é selecionar esse arquivo de header e na visualização Utilitários do projeto. Altere o arquivo de Projeto / Privado para Público. Veja a imagem abaixo:

Alterando o escopo do arquivo de cabeçalho

Na verdade, uma maneira mais fácil de corrigir isso é mover a instrução #import para o início do arquivo .m (em vez de tê-la no arquivo de header .h ). Desta forma, não irá reclamar que está incluindo um ficheiro de header não modular. Eu tive esse problema em que Allow non-module includes definir como YES não funcionou para mim, portanto, movendo-o para o arquivo de implementação, ele parou de reclamar. Essa é, de fato, a maneira preferida de importar e include arquivos de header de qualquer maneira. Depois de fazer isso, definir isso de volta para NO deve funcionar.

Idealmente, devemos tentar e ter como objective Allow non-module includes definidas como NO . Definir isso como YES na maioria dos casos significa que você está fazendo algo errado. A configuração se traduz em “Permitir a importação de arquivos de header randoms no disco que não fazem parte do módulo”. Isso se aplica a muito poucos casos de uso na prática e, portanto, essa configuração deve ser sempre NO (ou seja, o valor padrão).

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

Quando você obtiver esse erro, a solução em algumas circunstâncias pode ser simplesmente marcar o arquivo que está tentando importar como “público” no inspetor de arquivos “Associação de destino”. O padrão é “Projeto” e, quando configurado dessa maneira, pode causar esse erro. Esse foi o meu caso ao tentar importar os headers do Google Analytic para um framework, por exemplo.

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.

o mesmo problema tornar louco.Por fim, eu acho que colocar o ‘xxx.h’ importação na implementação em vez de interface pode corrigir o problema.E se você usar Cocoapods para gerenciar seu projeto.você pode adicionar

s.user_target_xcconfig = {‘CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES’ => ‘SIM’}

no seu arquivo ‘xxx.podspec’.

Se você precisar disso para os alvos do CocoaPods, adicione estas linhas no 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 

Se você vir esse erro em um header guardachuva ao criar uma estrutura dinâmica , certifique-se de importar seu arquivo como:

#import "MyFile.h"

e não como #import .

No caso, se você estiver desenvolvendo seu próprio framework:

Por que isso está acontecendo?

Se qualquer um dos arquivos de header públicos que você mencionou no seu module.modulemap tiver instruções de importação que não são mencionadas no modulemap, isso fornecerá o erro. Como ele tenta importar algum header que não é declarado como modular (em module.modulemap), ele quebra a modularidade do framework.

COMO posso consertar isso?

Apenas inclua o header que deu o erro ao seu module.modulemap e construa novamente!

POR QUE NÃO basta definir permitir não-modular para SIM?

Porque não é realmente uma solução aqui, com isso você diz ao seu projeto “este framework deveria ser modular, mas não é. Use de alguma forma, eu não me importo.” Isso não corrige o problema de modularidade da sua biblioteca.

Para obter mais informações, consulte esta postagem do blog ou consulte os documentos de clang .

Este foi um tipo de problema chato para mim. Nenhuma sugestão pareceu ajudar meu caso específico, já que eu precisava include os headers “não-modulares” no meu arquivo de header de arquivo individual. O trabalho em volta que eu usei estava colando a chamada de importação no arquivo de header de prefixo.

Acabei mudando o header do Umbrella para a parte inferior da lista Headers depois de verificar as soluções acima, e isso funcionou no Xcode 9.3.

Consegui eliminar dezenas desses erros usando o Git Clean. Aqui está o comando: git clean -dffx && git reset --hard