Erro de compilação - arquitetura i386 necessária ausente no arquivo

105

Estou recebendo este erro ao construir meu aplicativo para iPhone:

ld: aviso: em /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit, falta a arquitetura necessária i386 no arquivo

O mesmo vale para todas as estruturas do meu aplicativo. É muito estranho já que isso não estava acontecendo antes.

Gabe Shahbazian
fonte
Isso aconteceu depois de instalar o Snow Leopard e o novo iPhone SDK (Xcode 3.2)?
avocade
8
Minha resposta resolve o problema. Por favor, verifique.
Jordan,
9
Uma outra possibilidade que não é discutida nas respostas é que você obterá esse erro se tiver adicionado uma referência a uma estrutura não universal (ou seja, você adicionou uma estrutura armv6 / armv7 e depois tentou fazer uma construção de simulador). Essa é uma preocupação principalmente se você estiver construindo suas próprias estruturas customizadas.
aroth
@aroth também está correto, verifique esta pergunta
ArkReversed

Respostas:

131

Isso acontece quando você adiciona uma estrutura ao seu projeto e, sem querer, copia a estrutura para o diretório do projeto.

A correção é verificar o diretório do projeto (onde você armazena o projeto no disco) para qualquer arquivo iphone SDK * .Framework e excluí-los.

O projeto ficará bem depois disso.

Jordânia
fonte
4
além disso, teste-o no dispositivo iOS em vez do simulador.
Raptor
Se você tiver outra estrutura, então modificar o arquivo do projeto parece excluir as referências a ela também, funcionou, e foi mais fácil, obrigado Jordan
texian
Nao funciona para mim. Nenhum arquivo .framework no meu diretório de projeto. Fwiw, fiz uma limpeza e depois uma compilação e esse problema começou. O limpo de alguma forma deve ter quebrado coisas.
Alyoshak
85

Eu tive o mesmo problema, e a solução acabou sendo fácil de resolver. Faça backup e abra o project.pbxproj (localizado dentro do pacote do arquivo do projeto) em TextMate ou TextEdit e procure a seção intitulada "/ * Begin XCBuildConfiguration section * /". Procure uma chave chamada FRAMEWORK_SEARCH_PATHS e exclua-a e seu conteúdo (uma vez por configuração de compilação, portanto, removi-a em dois lugares). Aqui está um exemplo do que eu excluí:

FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library/Frameworks\"",);

Meu projeto agora é construído para o dispositivo iPhone e o iPhoneSimulator.

Sean Roehnelt
fonte
2
Posso verificar se isso funciona conforme descrito. Parece que o Xcode pode facilmente perder o contato com seus metadados ao mover projetos do Xcode entre diferentes computadores; neste caso, um com 3.0 e Leopard e o outro 3.1 e Snow Leopard instalados. Os metadados FRAMEWORK_SEARCH_PATHS são exibidos em branco nas configurações de compilação, enquanto o project.pbxproj real contém itens.
avocade
1
FRAMEWORK_SEARCH_PATHS concordado também apareceu em branco nas configurações de compilação para mim também. No entanto, a edição manual do arquivo project.pbxproj conforme descrito corrigiu o problema.
Alasdair Allan,
11
Isto não funcionou para mim. NO ENTANTO, você me leva ao lugar certo para procurar. Meu .pbxproj não tinha a chave FRAMEWORK_SEARCH_PATHS, mas uma chave chamada LIBRARY_SEARCH_PATHS.
rebelião de
Eu apoio @rebellion. Talvez as versões mais recentes do XCode tenham alterado o nome da chave.
Moshe
Obrigado, eu também tinha uma chave perdida LIBRARY_SEARCH_PATHS em meu arquivo pbxproj. A chave apareceu em negrito nas Configurações do projeto no Xcode 3, mas sem nenhum valor. Isso me levou a acreditar que algo estava errado. Eu abri o projeto no Xcode 4 Preview 5 uma vez, depois disso aconteceu.
mvexel
43

O que aconteceu aqui é que o Xcode adicionou misteriosamente uma entrada "Framework Search Paths" que aponta para um SDK de dispositivo iPhone específico. Por exemplo, o meu foi recentemente definido para:

$(DEVELOPER_DIR)/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.1.sdk/System/Library/Frameworks

Isso leva o compilador a encontrar estruturas da arquitetura incorreta. Remover quaisquer valores da chave "Framework Search Paths" nas configurações de compilação do seu destino resolverá o problema.

John Cromartie
fonte
esse era o problema no meu caso. ele adicionou um monte de diretórios de pesquisa sempre que adiciono uma nova biblioteca. mesmo se eu remover a referência, a entrada do diretório de pesquisa costumava estar lá e causou o problema.
darshansonde
"Framework Search Paths" já estão vazios no meu caso. O erro exato que estou recebendo é ld: build for iOS Simulator, mas a vinculação com dylib construída para o arquivo MacOSX '/usr/lib/libSystem.B.dylib' para a arquitetura i386 clang: error: o comando do linker falhou com o código de saída 1 ( use -v para ver a invocação) Estou usando o SDK 7.0 no Mavericks.
Ans
Eu tive o mesmo erro, removi os valores do caminho de pesquisa do framework nas configurações de Build e agora ele compila com sucesso.
Nirav
10

Eu só queria mencionar que, no XCode, se você ir em "Edit Project Settings" e encontrar "Search Paths", há um campo para "Framework Search Paths". Atualizar isso deve resolver o problema, sem ter que hackear o arquivo do projeto!

Felicidades!

Jesse


fonte
Eu tenho o mesmo problema que está me deixando totalmente louco. Parece que vocês conhecem a solução, mas não consigo localizar o arquivo "project.pbxproj" e não consigo encontrar onde "Editar configurações do projeto" está localizado.
saman01
2
No XCode 4.2.1 eu achei isso da seguinte maneira: clique no nome do projeto no Project Navigator. Na tela de propriedades que aparece, selecione a guia 'Build Settings'. Os caminhos de pesquisa estão localizados nesta tela. Excluí-los funcionou para mim.
dsteele
8

Verifique se você não copiou a estrutura em seu projeto quando a adicionou. Se você o copiou, ele não consegue encontrar os caminhos originais. Para resolver esse problema. Exclua a estrutura AVFoundation de sua pasta de estruturas em seu projeto e, em seguida, adicione-a novamente, mas, desta vez, certifique-se de que a verificação de cópia não esteja marcada.

Isso consertou para mim!

Jrman52
fonte
8

Corrigi de uma maneira diferente. A razão pela qual recebi esse erro foi porque adicionei security.framework duas vezes em meu projeto. Não consegui ver o framework de segurança no xcode, abri o projeto no finder e encontrei este framework que eu apaguei e o problema foi resolvido.

Suraj K Thomas
fonte
7

Se o seu aplicativo se destina a ser executado no dispositivo, certifique-se de não tentar executá-lo no simulador. Pode parecer óbvio, mas verifique mesmo assim.

Eric Brotto
fonte
5

Embora seja possível que algo tenha sido excluído, minha experiência mostra que algo fica bagunçado no arquivo do projeto. Ainda não consegui definir o que é esse "algo". Tive problemas semelhantes quando a instalação do SDK estava normal. Há um par de opções.

Primeiro, adicione todos os seus arquivos a um novo projeto. Isso geralmente parece funcionar. Mas é meio chato.

Em segundo lugar, você pode clicar com o botão direito do mouse no projeto em XCode / Get Info / Build / Library Search Paths. Adicione novos caminhos semelhantes a /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/lib. Adicione as versões apropriadas dessa string para cada versão (2.2.1, etc) e plataforma (simulador ou iPhoneOS). Execute uma ação semelhante para Caminhos de pesquisa de estrutura se as estruturas forem o seu problema.

Terceiro, o que é mais trabalhoso, porém mais confiável, é abrir project.pbxproj de dentro de MyProject.xcodeproj (o Textmate é bom para isso). Procure por "/ * Begin XCBuildConfiguration section * /", depois "LIBRARY_SEARCH_PATHS" e "FRAMEWORK_SEARCH_PATHS". Adicione ou modifique os caminhos conforme apropriado e salve o arquivo.

Em qualquer caso, um pé no saco, e com certeza gostaria de apontar a causa, porque isso já aconteceu algumas vezes. O projeto constrói bem, então simplesmente levanta e se recusa a fazê-lo com o que parece ser um pequeno motivo.

Mikestew
fonte
Vou começar um novo projeto. Oh bem.
Gabe Shahbazian
Você pode corrigir as configurações de construção "Frameworks Search Paths" no painel de informações de um destino.
John Cromartie
Recebi o erro, mas não tinha os problemas de estrutura descritos acima. Curiosamente, em um computador, o projeto poderia ser retirado do SVN e construído corretamente, enquanto em dois outros, de repente resultou neste erro em cada construção. A única solução (e bastante simples) - depois de tentar todos os tipos de outras soluções - foi criar um novo projeto em branco e mover todos os arquivos para ele.
mmattke,
Este método funcionou para mim. Eu tinha um conjunto de projetos funcionando que de repente parou de ser construído para exatamente uma configuração um dia. Sem motivo. Usei a técnica textmate acima e notei que "$ (SDKROOT) / Developer / Library / Frameworks" estava faltando nessa configuração. Não tenho ideia do porquê, e não consegui ver isso usando o Xcode.
Rob
4

"Editar configurações do projeto" e localizar "Caminhos de pesquisa" Há um campo para "Caminhos de pesquisa do framework". exclua tudo !!

Litebeam
fonte
4

Aconteceu aqui comigo também. Graças a um grande parceiro, encontramos a resposta. Seu Xcode pode estar apontando para o simulador .. altere-o para um dispositivo IOS ao invés ..construído suavemente após ....

j2emanue
fonte
1

Execute o comando file na estrutura do Terminal:

file /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/System/Library /Frameworks/UIKit.framework/UIKit

Você deve receber uma mensagem informando com quais arquiteturas o binário UIKit é compatível. Se você não vir "i386" listado, então, de alguma forma, você conseguiu remover a versão i386 do UIKit, o que significa que você não pode construir para o simulador. Para consertar isso, você terá que reinstalar o SDK.

Se você receber algum outro erro, espero que ele o ajude a descobrir qual é o problema real.

Mark Bessey
fonte
Reinstalei o sdk e ainda recebo o mesmo erro de compilação exato.
Gabe Shahbazian,
estou tendo esse problema. já verifiquei a estrutura e o caminho da biblioteca e estão limpos. o arquivo de comando /Developer/Platforms.../UIKit.framework/UIKit diz apenas "braço de biblioteca compartilhada vinculado dinamicamente Mach-O". é realmente necessário instalar todo o SDK? ou posso copiar a versão completa do framework?
Alexander Fradiani
Bom aprender! para o meu caso, armv7 e i386 estão lá, mas não armv6!
Nianliang
1

Só quero que você saiba que, no meu caso, eu estava tendo o mesmo problema, percebi que tinha uma pasta Xcode mais antiga chamada Xcode3.1.3. Acabei de renomeá-la porque era uma versão mais antiga e isso fez a mágica para mim.

Raya2
fonte
1

Verifique os caminhos de pesquisa da biblioteca nas configurações de destino. Às vezes, bibliotecas idiotas são inseridas lá e isso causará um erro semelhante.

Você pode remover todas as entradas nesta seção.

Atma
fonte
0

Eu tinha acabado de experimentar algo um pouco diferente, porque trabalho na minha própria biblioteca (WM_GSRecognizerLib), mas o erro é o mesmo.

O que aconteceria: devido a algumas atualizações, o caminho direcionado à biblioteca a ser incluída (.a) era da pasta "Debug-iphoneos" (onde é gerada). Compilar para dispositivos iOS genéricos funcionou bem, mas não para o simulador, reclamando da ausência da arquitetura i386.

O que fiz para esse problema foi incluir também os binários da pasta "Debug-iphonesimulator".

Isso pode ajudar neste tópico, porque a explicação está aqui: os dispositivos requerem binários para arm64 / armv7 / armv7s, enquanto o simulador precisa de i386.

tontonCD
fonte
0

Minha solução foi definir no simulador target debug YES, basta olhar no git status para ver a nova linha adicionada como arquitetura apenas em .project. se você não definir isso, a construção será executada em todas as arquiteturas e mostrará algumas arquiteturas ausentes, como i386 ou outra. OBSERVE QUE, obviamente, o principal problema é usar alguma estrutura que implemente algum tipo de arquitetura específica.

Guilherme Pedriconi
fonte
-1

Eu também recebi o mesmo erro ao usar o xcode versão 4.0.2, então o que fiz foi selecionar o arquivo de projeto xcode e, a partir deles, selecionei a opção Alvo e pude ver o aplicativo do meu projeto, então cliquei nele e fui para o build opção de configurações.

Na opção de pesquisa digitei caminho de pesquisa do Framework , excluí todas as configurações e cliquei no botão construir e funcionou bem para mim,

Obrigado e cumprimentos

Radix
fonte