Erro do vinculador Xcode: arquivo muito pequeno para a arquitetura x86_64

88

Estou desenvolvendo um aplicativo em Xcode.

Quando tento construir, surge este erro:

ld: in /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o, file too small for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Alguém sabe o que está errado?

tbodt
fonte
59
Tente uma reconstrução / limpeza completa. É possível que a compilação anterior tenha sido anormalmente abortada, deixando o TWRAppDelegate.oarquivo corrompido ou com tamanho zero.
Martin Baulig
5
Um pouco de precisão: você faz isso com cmd + shift + k, se isso não funcionar, vá para a pasta de dados derivados e exclua a pasta nomeada como seu projeto.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Não há mais necessidade de destruir as pastas você mesmo. Mantenha a tecla Option pressionada e o comando Limpar (que está no menu Produto) muda para “Limpar pasta de compilação ...”, que faz isso para você.
Peter Hosey
A sugestão de Martin Baulig resolveu meu problema. Obrigado!
tbodt
2
@PeterK. Isso está me rendendo o distintivo de prata da Nice Question :-)
tbodt

Respostas:

186

Roubando a resposta de @martin-baulig:

Tente uma reconstrução / limpeza completa. É possível que a compilação anterior tenha sido anormalmente abortada, deixando o arquivo TWRAppDelegate.o corrompido ou com tamanho zero.

Peter K.
fonte
7
Finalmente! Você merece isso.
tbodt
Obrigado! :-) Bem, a resposta de @martin-bailig nos comentários me ajudou, mas seria melhor tê-la aqui como uma resposta real.
Peter K.
2
Meu projeto demora um pouco para ser construído. Você pode escapar excluindo apenas os arquivos de 1 a 4 objetos que foram corrompidos se você interromper a construção de forma anormal, em vez de tudo.
Fernando Mazzon
20

Eu geralmente adiciono um espaço (pode ser qualquer caractere) ao arquivo em questão, removo-o e depois salvo. Mais fácil e rápido do que uma construção limpa.

Grassyburrito
fonte
2
Sua resposta me poupa 10 minutos de reconstruir o projeto! Obrigado
Accid Bright
8

Para corrigir automaticamente esse problema Build Script Phasepode ser adicionado. Vá para Xcode -> Seu Projeto -> Seu Destino -> Fases de Construção -> + -> Nova Fase de Execução de Script

Renomeie-o para Xcode Link Fixe mova-o acima da Compile Sourcesfase. Cole isso no corpo do script:

# Legacy build system
legacy_dir=`dirname "${LD_DEPENDENCY_INFO_FILE}"`
if [ -d "${legacy_dir}" ]; then
    find "${legacy_dir}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

# New build system
if [ -d "${OBJECT_FILE_DIR_normal}" ]; then
    find "${OBJECT_FILE_DIR_normal}" -size 0 | while read -d $'\n' file; do
        rm "$file"
    done
fi

Este script verifica se há arquivos de objeto com tamanho zero e os remove para que quando a compilação for feita na próxima etapa, ele terá sucesso.

Você precisa adicionar este script para cada destino de aplicativo, se tiver muitos.

Este script leva cerca de 0,1 segundo para ser executado e evita a reconstrução completa do projeto.

Anton Plebanovich
fonte
É genial! Precisa ter em cada projeto.
Nik Kov
7

rm -rf /Users/hostname/Library/Developer/Xcode/DerivedData

yeyimilk
fonte
5

apenas remova este arquivo executando cmd em seu aplicativo de terminal:

rm /Users/theodore/Library/Developer/Xcode/DerivedData/Tower-bkpdifuqssebjdgurzmtirbxejnn/Build/Intermediates/Tower.build/Debug/Tower.build/Objects-normal/x86_64/TWRAppDelegate.o

Haithngn
fonte
1
Eu resolvi isso da mesma maneira, muito mais rápido do que limpar / compilar completamente meu grande projeto. Da próxima vez que tentarei a solução de @Anton Plebanovich, ela pode ser uma excelente maneira de automatizar essa correção.
Romano
2

Maneira rápida de corrigir o erro sem limpeza completa do cache:

  1. Abrir arquivo descrito com erro (no caso desta questão TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. Reconstruir - falhar
  5. cmd + V
  6. Reconstruir - sucesso
Vadim Akhmerov
fonte
1

Uma vez que construir um projeto limpo pode demorar muito, existe um caminho mais curto para aqueles que têm acesso ao arquivo que está corrompido no cache:

  • Exclua o arquivo (Remover referência)
  • Construir projeto
  • Reinserir arquivo
  • Construir projeto

Versão completa para que você não tenha problemas para encontrar o arquivo:

  • Encontre o arquivo no navegador de projetos Xcode
  • Clique com o botão direito no arquivo e pressione "mostrar no localizador" (abre um localizador no local onde o arquivo está)
  • Selecione o arquivo no Xcode e pressione backspace e clique em "Remover referência"
  • Construir projeto (irá falhar, mas espere que termine)
  • Reinsira o arquivo arrastando-o do localizador para o mesmo local em que você acabou de excluí-lo
  • Construir projeto (deve funcionar agora)
Oblak de Matic
fonte
1

Você pode simplesmente deletar o arquivo TWRAppDelegate.o e continuar sua construção. Copie o caminho completo mencionado na mensagem de erro e cole-o atrás de um comando 'rm' em seu terminal. Não há necessidade de limpar / reconstruir, excluir dados derivados, adicionar / remover o arquivo do projeto, etc.

Jason Pepas
fonte
-1

Etapa 1. Vá para: Projeto> Configurações de compilação> Caminhos de pesquisa

Etapa 2. Defina "Sempre pesquisar caminhos de usuário" como Sim

Etapa 3. Construir o projeto (você receberá um aviso, mas o projeto será construído.)

Etapa 4. Defina "Sempre Pesquisar caminhos do usuário" como Não e crie novamente para eliminar o aviso

tland
fonte
Pode apenas adicionar isso para outras pessoas que encontrarem esta resposta. "Always Search User Path" tornou-se obsoleto no Xcode 8.3 e a partir da documentação também diz "Desativá-lo é altamente recomendado." (Ou seja, definindo como NÃO)
Groot
-1

Uma reconstrução limpa não funcionou no meu caso, então explico como resolvi o problema:
- Removida a referência ao arquivo (não exclua o arquivo)
- Adicione o arquivo ao projeto novamente e execute

David Santiago
fonte
Um voto negativo requer uma explicação, funcionou para mim e poderia funcionar para qualquer outra pessoa
David Santiago,