Parece que podemos - teoricamente - construir uma única biblioteca estática que inclui o simulador e o iPhone e o iPad.
No entanto, a Apple não possui nenhuma documentação sobre isso que eu possa encontrar, e os modelos padrão do Xcode NÃO estão configurados para fazer isso.
Estou procurando uma técnica simples, portátil e reutilizável que possa ser executada no Xcode.
Alguma história:
- Em 2008, costumávamos criar libs estáticas únicas que incluíam sim e dispositivo. A Apple desativou isso.
- Ao longo de 2009, criamos pares de bibliotecas estáticas - uma para sim, outra para dispositivo. A Apple também desativou isso também.
Referências:
Essa é uma ótima idéia, é uma excelente abordagem, mas não funciona: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Há alguns erros no script dele, o que significa que ele funciona apenas em sua máquina - ele deve estar usando BUILT_PRODUCTS_DIR e / ou BUILD_DIR em vez de "adivinhar" eles)
- O Xcode mais recente da Apple impede que você faça o que ele fez - ele simplesmente não funcionará, devido à alteração (documentada) na maneira como o Xcode processa os destinos)
Outro questionador do SO perguntou como fazê-lo SEM xcode, e com respostas focadas na parte arm6 versus arm7 - mas ignorou a parte i386: Como compilar uma biblioteca estática (gordura) para armv6, armv7 e i386
- Desde as últimas mudanças da Apple, a parte do simulador não é mais a mesma diferença arm6 / arm7 - é um problema diferente, veja acima)
Respostas:
ALTERNATIVAS:
Fácil copiar / colar da versão mais recente (mas as instruções de instalação podem mudar - veja abaixo!)
A biblioteca de Karl exige muito mais esforço para configurar, mas uma solução de longo prazo muito melhor (converte sua biblioteca em um Framework).
Use isso e ajuste-o para adicionar suporte para compilações de arquivo morto .
ALTERAÇÕES RECENTES: 1. Adicionado suporte para iOS 10.x (mantendo o suporte para plataformas mais antigas)
Informações sobre como usar esse script com um projeto incorporado em outro projeto (embora eu recomendo NÃO fazer isso, nunca - a Apple tem alguns bugs no Xcode, se você incorporar projetos um no outro, a partir do Xcode 3.x até o Xcode 4.6.x)
Script de bônus para permitir a inclusão automática de pacotes (por exemplo, incluir arquivos PNG, arquivos PLIST etc. da sua biblioteca!) - veja abaixo (role para baixo)
agora suporta iPhone5 (usando a solução da Apple para os erros no lipo). NOTA: as instruções de instalação foram alteradas (provavelmente posso simplificar isso alterando o script no futuro, mas não quero arriscar agora)
A seção "copiar cabeçalhos" agora respeita a configuração de construção para a localização dos cabeçalhos públicos (cortesia de Frederik Wallner)
Adicionado configuração explícita de SYMROOT (talvez também seja necessário definir OBJROOT?), Graças a Doug Dickinson
SCRIPT (é isso que você precisa copiar / colar)
Para instruções de uso / instalação, veja abaixo
INSTRUÇÕES DE INSTALAÇÃO
... Uso opcional de bônus:
Se você não conseguir encontrar o arquivo de saída, aqui está uma solução alternativa:
Adicione o seguinte código ao final do script (cortesia de Frederik Wallner): abra "$ {CREATING_UNIVERSAL_DIR}"
A Apple exclui toda a saída após 200 linhas. Selecione seu destino e, na fase Executar script, você DEVE desmarcar: "Mostrar variáveis de ambiente no log de construção"
se você estiver usando um diretório "build output" personalizado para o XCode4, o XCode colocará todos os seus arquivos "inesperados" no lugar errado.
... esse é o local do seu Universal Build.
Como incluir arquivos "sem código de origem" em seu projeto (PNG, PLIST, XML, etc)
Script para copiar automaticamente os pacotes configurados na mesma pasta da sua biblioteca estática FAT:
fonte
Passei muitas horas tentando criar uma biblioteca estática gorda que funcione nos armv7, armv7s e no simulador. Finalmente encontrei uma solução .
O essencial é criar as duas bibliotecas (uma para o dispositivo e depois uma para o simulador) separadamente, renomeá-las para se distinguirem umas das outras e depois criá-las em uma biblioteca.
Eu tentei e funciona!
fonte
Eu criei um modelo de projeto do XCode 4 que permite criar uma estrutura universal tão facilmente quanto criar uma biblioteca comum.
fonte
Existe um utilitário de linha de comando
xcodebuild
e você pode executar o comando shell no xcode. Portanto, se você não se importa em usar um script personalizado, esse script pode ajudá-lo.Talvez pareça ineficiente (não sou bom em shell script), mas fácil de entender. Eu configurei um novo destino executando apenas este script. O script foi projetado para linha de comando, mas não foi testado em :)
O conceito central é
xcodebuild
elipo
.Eu tentei muitas configurações na interface do Xcode, mas nada funcionou. Como esse é um tipo de processamento em lote, o design da linha de comando é mais adequado e a Apple remove o recurso de criação em lote do Xcode gradualmente. Portanto, não espero que eles ofereçam o recurso de criação de lotes com base na interface do usuário no futuro.
fonte
Eu precisava de uma lib estática gorda para o JsonKit, então criei um projeto de lib estática no Xcode e executei esse script bash no diretório do projeto. Desde que você tenha configurado o projeto xcode com "Build only configuration active" desativado, você deve obter todas as arquiteturas em uma lib.
fonte
Atualização do IOS 10:
Eu tive um problema ao criar o fatlib com o iphoneos10.0 porque a expressão regular no script espera apenas 9.xe inferior e retorna 0.0 para o ios 10.0
para corrigir isso basta substituir
com
fonte
Eu fiz isso em um modelo Xcode 4 , na mesma linha que o modelo de quadro estático de Karl.
Descobri que a construção de estruturas estáticas (em vez de bibliotecas estáticas simples) estava causando falhas aleatórias no LLVM, devido a um aparente bug no vinculador - então, acho que as bibliotecas estáticas ainda são úteis!
fonte
Bom trabalho! Eu cortei algo semelhante, mas tive que executá-lo separadamente. Só fazer parte do processo de compilação o torna muito mais simples.
Um item de nota. Notei que ele não copia nenhum dos arquivos de inclusão que você marca como público. Eu adaptei o que eu tinha no meu script ao seu e funciona bastante bem. Cole o seguinte no final do seu script.
fonte
Na verdade, acabei de escrever meu próprio script para esse fim. Não usa o Xcode. (É baseado em um script semelhante no projeto Gambit Scheme.)
Basicamente, ele roda ./configure e make três vezes (para i386, armv7 e armv7s) e combina cada uma das bibliotecas resultantes em uma lib de gordura.
fonte