Błąd konsolidatora Xcode: plik jest za mały dla architektury x86_64

88

Rozwijam aplikację w Xcode.

Kiedy próbuję budować, pojawia się ten błąd:

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)

Czy ktoś wie, co się stało?

tbodt
źródło
59
Spróbuj przeprowadzić pełną przebudowę / czyszczenie. Możliwe, że poprzednia kompilacja została nieprawidłowo przerwana, pozostawiając TWRAppDelegate.oplik uszkodzony lub o zerowym rozmiarze.
Martin Baulig,
5
Trochę precyzji: robisz to za pomocą cmd + shift + k, jeśli to nie zadziała, przejdź do folderu danych pochodnych i usuń folder nazwany jako projekt.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Nie ma już potrzeby samodzielnego usuwania folderów kompilacji do kosza. Przytrzymaj klawisz Option, a polecenie Wyczyść (w menu Produkt) zmieni się na „Wyczyść folder budowania…”, co zrobi to za Ciebie.
Peter Hosey
Sugestia Martina Bauliga rozwiązała mój problem. Dzięki!
tbodt
2
@PeterK.
Zarabia

Odpowiedzi:

186

Kradzież odpowiedzi @ martin-baulig:

Spróbuj przeprowadzić pełną przebudowę / czyszczenie. Możliwe, że poprzednia kompilacja została nieprawidłowo przerwana, pozostawiając plik TWRAppDelegate.o uszkodzony lub ma zerowy rozmiar.

Peter K.
źródło
7
Wreszcie! Zasługujesz na to.
tbodt
Dzięki! :-) Cóż, odpowiedź @ martin-bailig w komentarzach pomogła mi, ale lepiej byłoby mieć ją tutaj jako prawdziwą odpowiedź.
Peter K.
2
Mój projekt zajmuje trochę czasu. Możesz uciec od usunięcia tylko plików obiektowych 1-4, które zostaną uszkodzone, jeśli zatrzymasz kompilację w nienormalny sposób, a nie wszystko.
Fernando Mazzon
20

Zwykle dodaję spację (może to być dowolny znak) do danego pliku, usuwam go, a następnie zapisuję. Łatwiejsze i szybsze niż czysta kompilacja.

grassyburrito
źródło
2
Twoja odpowiedź zaoszczędzi mi 10 minut na przebudowie projektu! Dzięki
Accid Bright
8

Aby automatycznie rozwiązać ten problem, Build Script Phasemożna dodać. Idź do Xcode -> Your Project -> Your Target -> Build Phases -> + -> New Run Script Phase

Zmień jego nazwę na Xcode Link Fixi przenieś go powyżej Compile Sourcesfazy. Wklej to do treści skryptu:

# 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

Ten skrypt sprawdza pliki obiektowe o zerowym rozmiarze i usuwa je, więc po zakończeniu kompilacji w następnym kroku kończy się sukcesem.

Musisz dodać ten skrypt dla każdego celu aplikacji, jeśli masz ich wiele.

Uruchomienie tego skryptu zajmuje około 0,1 sekundy i pozwala uniknąć pełnej przebudowy projektu.

Anton Plebanovich
źródło
To genialne! Trzeba mieć w każdym projekcie.
Nik Kov
7

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

yeyimilk
źródło
5

po prostu usuń ten plik, uruchamiając cmd w aplikacji terminala:

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

haithngn
źródło
1
Rozwiązałem to w ten sam sposób, znacznie szybciej niż pełne czyszczenie / kompilacja w moim dużym projekcie. Następnym razem, gdy wypróbuję rozwiązanie @Anton Plebanovich, może to być doskonały sposób na zautomatyzowanie tej poprawki.
Romano
2

Szybki sposób na naprawienie błędu bez całkowitego czyszczenia pamięci podręcznej:

  1. Otwórz plik opisany błędnie (w przypadku tego pytania TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. Przebuduj - niepowodzenie
  5. cmd + V
  6. Przebuduj - odniesiesz sukces
Vadim Akhmerov
źródło
1

Ponieważ tworzenie czystego projektu może zająć zbyt dużo czasu, istnieje krótsza droga dla tych, którzy mają dostęp do pliku, który jest uszkodzony w pamięci podręcznej:

  • Usuń plik (Usuń odniesienie)
  • Zbuduj projekt
  • Ponownie włóż plik
  • Zbuduj projekt

Pełna wersja, więc nie masz problemu ze znalezieniem pliku:

  • Znajdź plik w nawigatorze projektów Xcode
  • Kliknij plik prawym przyciskiem myszy i naciśnij „pokaż w wyszukiwarce” (otwiera wyszukiwarkę w lokalizacji, w której znajduje się plik)
  • Wybierz plik w Xcode i naciśnij Backspace, a następnie kliknij „Usuń odniesienie”
  • Zbuduj projekt (zakończy się niepowodzeniem, ale poczekaj, aż się zakończy)
  • Wstaw plik ponownie, przeciągając go z wyszukiwarki do tej samej lokalizacji, w której został właśnie usunięty
  • Kompiluj projekt (powinien teraz działać)
Matic Oblak
źródło
1

Możesz po prostu usunąć plik TWRAppDelegate.o i kontynuować budowanie. Skopiuj pełną ścieżkę wymienioną w komunikacie o błędzie i wklej ją za poleceniem „rm” w swoim terminalu. Nie ma potrzeby czyszczenia / przebudowywania, usuwania danych pochodnych, dodawania / usuwania pliku z projektu itp.

Jason Pepas
źródło
-1

Krok 1. Przejdź do: Projekt> Ustawienia kompilacji> Ścieżki wyszukiwania

Krok 2. Ustaw opcję „Zawsze wyszukuj ścieżki użytkownika” na Tak

Krok 3. Skompiluj projekt (otrzymasz ostrzeżenie, ale projekt zostanie zbudowany).

Krok 4. Ustaw „Zawsze przeszukuj ścieżki użytkownika” z powrotem na Nie i buduj ponownie, aby wyeliminować ostrzeżenie

tland
źródło
Możesz po prostu dodać to dla innych, którzy znajdą tę odpowiedź. „Zawsze przeszukuj ścieżkę użytkownika” została wycofana w wersji Xcode 8.3, aw dokumentacji jest również napisane „Wyłączenie tej opcji jest zdecydowanie zalecane”. (To znaczy ustawienie na NIE)
Groot
-1

Czysta odbudowa nie zadziałała w moim przypadku, więc wyjaśniam, jak rozwiązałem problem:
- Usunięto odniesienie do pliku (nie usuwaj pliku)
- Ponownie dodaj plik do projektu i uruchom

David Santiago
źródło
Głosowanie negatywne wymaga wyjaśnienia, zadziałało dla mnie i może zadziałać dla każdego
David Santiago