Títulos alternativos para auxiliar na pesquisa
- O Xcode não consegue encontrar o cabeçalho
- .H ausente no Xcode
- Arquivo Xcode .h não encontrado
- Arquivo de problema léxico ou pré-processador não encontrado
Estou trabalhando em um projeto de aplicativo iOS que veio do Xcode 3. Agora mudei para o Xcode 4, meu projeto constrói uma série de bibliotecas estáticas.
Essas bibliotecas estáticas também declaram cabeçalhos públicos e esses cabeçalhos são usados pelo código do aplicativo. No Xcode 3.x, os cabeçalhos foram copiados (como uma fase de construção) para o e public headers directory
, no projeto do aplicativo, public headers directory
foram adicionados ao headers search list
.
No Xcode 4, o diretório de construção é movido para ~/Library/Developer/Xcode/DerivedData/my-project
.
O problema é como faço referência a esse novo local nas configurações de pesquisa de cabeçalhos? Parece que:
public headers directory
é relativo aoDerivedData
diretório, masheaders search
diretório é relativo a outra coisa (possivelmente a localização do projeto)
Como devo configurar um destino de biblioteca estática para o desenvolvimento de iOS no Xcode 4 que garantirá que os arquivos de cabeçalho sejam disponibilizados para os clientes que usam a biblioteca estática ao tentar compilar como uma dependência?
fonte
Respostas:
Cada uma das soluções que vi para esse problema parecia deselegante (copiar cabeçalhos no projeto do aplicativo) ou excessivamente simplificada a ponto de funcionar apenas em situações triviais.
A resposta curta
Adicione o seguinte caminho aos caminhos de pesquisa do cabeçalho do usuário
Por que isso funciona?
Primeiro, precisamos entender o problema. Em circunstâncias normais, ou seja, quando você executa, testa, cria um perfil ou analisa, o Xcode cria seu projeto e coloca a saída no diretório Build / Products / Configuration / Products, que está disponível por meio da macro $ BUILT_PRODUCTS_DIR .
A maioria dos guias sobre bibliotecas estáticas recomenda definir o caminho da pasta de cabeçalhos públicos como $ TARGET_NAME , o que significa que seu arquivo lib se torna $ BUILT_PRODUCTS_DIR /libTargetName.a e seus cabeçalhos são colocados em $ BUILT_PRODUCTS_DIR / TargetName. Contanto que seu aplicativo inclua $ BUILT_PRODUCTS_DIR em seus caminhos de pesquisa, as importações funcionarão nas 4 situações fornecidas acima. No entanto, isso não funcionará quando você tentar arquivar.
O arquivamento funciona um pouco diferente
Quando você arquiva um projeto, o Xcode usa uma pasta diferente chamada ArchiveIntermediates. Nessa pasta, você encontrará / YourAppName / BuildProductsPath / Release-iphoneos /. Esta é a pasta para a qual $ BUILT_PRODUCTS_DIR aponta quando você faz um arquivo. Se você olhar lá, verá que há um link simbólico para o arquivo de biblioteca estática construída, mas a pasta com os cabeçalhos está faltando.
Para encontrar os cabeçalhos (e o arquivo lib), você precisa ir para IntermediateBuildFilesPath / UninstalledProducts /. Lembra-se de quando lhe foi dito para definir Ignorar instalação como SIM para bibliotecas estáticas? Bem, este é o efeito que a configuração tem quando você faz um arquivo.
Nota lateral: Se você não configurar para pular a instalação, seus cabeçalhos serão colocados em outro local e o arquivo lib será copiado para seu arquivo, impedindo você de exportar um arquivo .ipa que você pode enviar para a App Store .
Depois de muita pesquisa, não consegui encontrar nenhuma macro que correspondesse exatamente à pasta UninstalledProducts, daí a necessidade de construir o caminho com "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts"
Resumo
Para sua biblioteca estática, certifique-se de pular a instalação e de que seus cabeçalhos públicos sejam colocados em $ TARGET_NAME.
Para seu aplicativo, defina os caminhos de pesquisa do cabeçalho do usuário como "$ (BUILT_PRODUCTS_DIR)", que funciona bem para compilações regulares, e "$ (BUILD_ROOT) /../ IntermediateBuildFilesPath / UninstalledProducts", que funciona para compilações de arquivo.
fonte
$(TARGET_BUILD_DIR)
. Mesmo durante o arquivamento. ;)Encontrei o mesmo problema ao desenvolver minha própria biblioteca estática e, embora a resposta de Colin tenha sido muito útil, tive que modificá-la um pouco para funcionar de forma consistente e simples ao executar e arquivar projetos no Xcode 4 usando um espaço de trabalho.
O que é diferente no meu método é que você pode usar um único caminho de cabeçalho do usuário para todas as suas configurações de compilação.
Meu método é o seguinte:
Crie um espaço de trabalho
Configurações do projeto de biblioteca estática
Eu adotei isso do uso com RestKit e descobri que funciona melhor com todas as minhas bibliotecas estáticas. O que isso faz é instruir o Xcode a copiar todos os cabeçalhos que movemos para a seção de cabeçalhos "Públicos" na etapa 1 para a pasta que especificamos aqui, que reside na pasta Dados Derivados durante a construção. Como no RestKit, gosto de usar uma única pasta "incluir" para conter cada biblioteca estática que estou usando em um projeto.
Também não gosto de usar macros aqui porque isso nos permitirá usar um único caminho de pesquisa de cabeçalho de usuário posteriormente, quando configurarmos o projeto usando a biblioteca estática.
Configurações para o projeto usando a biblioteca estática
Na mesma área, encontre os Caminhos de pesquisa do cabeçalho do usuário e adicione:
"$ (PROJECT_TEMP_DIR) /../ UninstalledProducts / include"
Isso diz ao Xcode para procurar bibliotecas estáticas dentro da pasta de compilação intermediária que o Xcode cria durante o processo de compilação. Aqui, temos a pasta "incluir" que estamos usando para nossos locais de biblioteca estática que configuramos na etapa 2 para as configurações do projeto de biblioteca estática. Esta é a etapa mais importante para fazer com que o Xcode encontre corretamente suas bibliotecas estáticas.
Configure o espaço de trabalho
Aqui, queremos configurar o espaço de trabalho para que ele construa a biblioteca estática quando construirmos nosso aplicativo. Isso é feito editando o esquema usado em nosso aplicativo.
Comece a usar a biblioteca
Agora, você deve ser capaz de importar sua biblioteca estática usando
Este método contorna o incômodo de ter que ter caminhos de cabeçalho de usuário diferentes para configurações diferentes, então você não deve ter problemas para compilar para arquivos.
Por que isso funciona?
Tudo depende deste caminho:
Como configuramos nossa biblioteca estática para usar "Ignorar instalação", os arquivos compilados são movidos para a pasta "UninstalledProjects" dentro do diretório temporário de construção. Nosso caminho aqui também resolve para a pasta "incluir" que configuramos para nossa biblioteca estática e usamos para nosso caminho de pesquisa de cabeçalho do usuário. Os dois trabalhando juntos permitem que o Xcode saiba onde encontrar nossa biblioteca durante o processo de compilação. Como esse diretório de construção temporário existe para as configurações de Depuração e Liberação, você só precisa de um único caminho para o Xcode pesquisar bibliotecas estáticas.
fonte
O projeto Xcode 4 falha ao compilar uma biblioteca estática
Os erros podem incluir; arquivos de cabeçalho ausentes, "problema léxico ou pré-processador"
Soluções:
fonte
Este foi um tópico muito útil. Ao pesquisar minha própria situação, descobri que a Apple tem um documento de 12 páginas datado de setembro de 2012 com o título "Usando bibliotecas estáticas no iOS". Aqui está o link do pdf: http://developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf
É muito mais simples do que a maioria das discussões na Internet e, com alguns pequenos mods para explicar como as bibliotecas externas que estou usando estão configuradas, está funcionando bem para mim. A parte mais importante é provavelmente:
Estou certo de que, em muitas situações existentes, a abordagem da Apple pode não ser suficiente. Eu posto isso aqui para qualquer um que está apenas começando sua jornada no caminho do jardim da biblioteca estática - este pode ser o melhor ponto de partida para casos simples.
fonte
http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html
Por documentação da Apple:
Sua biblioteca terá um ou mais arquivos de cabeçalho que os clientes dessa biblioteca precisam importar. Para configurar quais cabeçalhos são exportados para clientes, selecione seu projeto de biblioteca para abrir o editor de projeto, selecione o destino da biblioteca para abrir o editor de destino e selecione a guia de fases de construção. Se o destino da sua biblioteca tiver uma fase de construção “Copiar cabeçalhos”, você deve excluí-la; As fases de construção de cabeçalhos de cópia não funcionam corretamente com destinos de biblioteca estática ao executar a ação “Arquivar” no Xcode.
fonte
Dê uma olhada na solução de Jonah Wlliam (no meio) e no modelo GitHub (nos comentários) para uma visão. http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/
fonte
Adicione $ (OBJROOT) / UninstalledProducts / exactPathToHeaders aos Caminhos de pesquisa do cabeçalho.
Por algum motivo, a caixa de seleção recursiva não funcionou para mim e tive que adicionar o resto do caminho para onde os cabeçalhos estão localizados.
No Log Navigator no Xcode (a guia à direita do navegador dos pontos de interrupção), você pode ver o histórico de construção. Se você selecionar a falha de construção real, poderá expandir seus detalhes para ver o PATH setenv e verificar se o caminho para seus arquivos de cabeçalho está lá.
fonte
No meu caso, meu espaço de trabalho tinha alguns projetos de biblioteca estática e um deles tem dependência do outro, incluindo arquivos de cabeçalho. O problema era com a ordem de construção. Na página Editar Esquema na seção Compilar, desmarquei a opção paralelizar e organizei a ordem dos destinos de acordo com as dependências e resolvi pelo problema
fonte
Adicione o seguinte caminho para seus caminhos de pesquisa de cabeçalho de usuário:
Isso foi verificado!
fonte
Correndo o risco de mostrar como sou idiota ... Tenho sofrido com o XCode me recusando a encontrar meus arquivos .h a tarde toda.
Então eu percebi.
Como estava usando o "XCode 4", decidi "inteligentemente" colocar todos os meus projetos em subpastas de uma pasta chamada " Projetos XCode 4 ".
Esses espaços no nome da pasta bagunçaram muito o XCode!
Renomear esta pasta para " XCode_4_Projects " trouxe alegria (e menos palavrões) de volta à minha vida.
Lembre-me de novo, em que ano estamos?
Talvez alguém pudesse contar aos desenvolvedores da Apple ...
fonte
Nenhuma dessas respostas funcionou para mim. Aqui está o que aconteceu. Adicione exatamente o seguinte (copie e cole, incluindo as aspas duplas) à configuração de criação de Caminhos de pesquisa do cabeçalho do usuário :
Observe a adição do subdiretório "/ include /" em comparação com outras respostas. Como outros usuários apontaram, a opção "recursiva" não parece fazer nada, então você pode ignorá-la.
Meu projeto agora foi capaz de arquivar com êxito ao importar arquivos de cabeçalho de biblioteca estática no seguinte formato:
Você não precisa habilitar a configuração Always Search User Paths , a menos que esteja incluindo os cabeçalhos de sua biblioteca estática com colchetes angulares (
#import <LibraryName/HeaderFile.h>
), mas você realmente não deveria fazer isso de qualquer maneira se não for um cabeçalho de sistema / estrutura.fonte
Nenhuma das respostas acima funcionou para mim no Xcode 7, mas elas me deram uma boa ideia. Para os caras que lutam com o Xcode 7, resolvi isso adicionando o seguinte ao User Header Search Paths (inclua aspas)
Altere a parte relativa do URL de
usr/local/include
acordo com o que está lá na configuração 'Public Header Folder Path' da biblioteca estáticafonte
Este é um problema relacionado que me levou a esta pergunta, então estou adicionando minha solução estritamente para documentação / poderia economizar mais horas de suor
Arquivo DropboxSDK.h não encontrado
Depois de dias tentando fazer o VES compilar para iOS, eventualmente encontrei esse problema. O
DropboxSDK.h
estava definitivamente ao alcance desearch headers
Eu até o adicionei aoframework headers
caminho de pesquisa,include
d o.h
diretamente e fiz todos os tipos de grandes comprimentos para tentar serDropboxSDK.h
encontrado.Solução
EXPLICITY arraste o
DropboxSDK.framework
arquivo para o XcodeProject Navigation
e certifique-se de queCopy Files if needed
está marcado. Além disso, certifique-se de que seu alvo seja verificado conforme necessário.Aviso
Definir a localização explícita da estrutura em
build phases
não funcionou para mim. Tive que arrastar o .framework para o Xcode e garantir que os arquivos foram copiados para o meu projeto.# mbp2015 # xcode7 # ios9
fonte
Existem várias maneiras complexas de fazer isso, e algumas soluções muito inteligentes são propostas neste tópico.
O principal problema de todas essas soluções é que elas diminuem seriamente a portabilidade da biblioteca.
Minha escolha foi, finalmente, simplesmente usar frameworks - sempre - como recomendado pela Apple (Vídeos WWDC).
É tão mais fácil e faz o mesmo trabalho no final!
Outra solução bastante elegante que parece funcionar é usar o Private Cocoapods. O Cocoapods faz todo o trabalho de configuração, cópia do cabeçalho e assim por diante.
Frameworks rock!
fonte
simply use frameworks - always -
Aqui está o que resolveu o mesmo problema para mim.
Eu tenho um App Target e um iMessage Extension Target. Então eu tinha 2 SDKs (meu próprio), aos quais o App Target se vincula.
O problema era: meu destino iMessage também estava usando os 2 SDKs meus (projetos separados), mas não estava vinculando a eles nas fases de construção -> Vincular binário às bibliotecas. Tive que adicionar meus 2 SDKs ao iMessage Target lá, para corresponder ao meu destino de aplicativo, e agora ele arquiva.
Portanto, a moral da história é: se você tiver vários alvos, como extensões, certifique-se de que todos os seus alvos estejam vinculados às bibliotecas de que precisam. Ele foi capaz de construir e implantar no simulador e no dispositivo, mas não arquivar.
fonte
Atualização: Xcode 9
As respostas acima não funcionaram para mim usando o Xcode 9, mas essa resposta funcionou perfeitamente para mim. Eu adicionei
$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include
aos meus "Caminhos de pesquisa de cabeçalho" e o Xcode vinculou o cabeçalho da minha biblioteca estática sem problemas.fonte
Evite problemas e faça isso = crie uma nova conta de usuário em seu Mac - abra o projeto com a nova conta de usuário - todos os problemas desaparecem. Economize seu tempo e mantenha sua sanidade. todas aquelas respostas nerds não ajudam !!
Boa sorte
fonte