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?


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.


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.


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.


To genialne! Trzeba mieć w każdym projekcie.
Nik Kov


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


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

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ć)

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.


-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


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


Głosowanie negatywne wymaga wyjaśnienia, zadziałało dla mnie i może zadziałać dla każdego
David Santiago
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.