Xcode-Linker-Fehler: Datei zu klein für Architektur x86_64

83

Ich entwickle eine Anwendung in Xcode.

Wenn ich versuche zu erstellen, tritt dieser Fehler auf:

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)

Weiß jemand was falsch ist?

tbodt
quelle
56
Versuchen Sie eine vollständige Wiederherstellung / Reinigung. Es ist möglich, dass ein vorheriger Build abnormal abgebrochen wurde und die TWRAppDelegate.oDatei beschädigt oder von der Größe Null ist.
Martin Baulig
5
Eine kleine Präzisierung: Sie tun dies mit cmd + shift + k. Wenn dies nicht funktioniert, gehen Sie in den abgeleiteten Datenordner und löschen Sie den Ordner, der als Ihr Projekt bezeichnet wird.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Es ist nicht mehr nötig, selbst Ordner zu erstellen. Halten Sie die Option gedrückt, und der Befehl "Bereinigen" (im Menü "Produkt") ändert sich in "Build-Ordner bereinigen ...", was dies für Sie erledigt.
Peter Hosey
Martin Bauligs Vorschlag löste mein Problem. Vielen Dank!
tbodt
2
@ PeterK. Es
bringt

Antworten:

181

Die Antwort von @ martin-baulig stehlen:

Versuchen Sie eine vollständige Wiederherstellung / Reinigung. Es ist möglich, dass der vorherige Build abnormal abgebrochen wurde und die Datei TWRAppDelegate.o beschädigt oder von der Größe Null ist.

Peter K.
quelle
7
Schließlich! Du verdienst es.
tbodt
Vielen Dank! :-) Nun, @ Martin-Bailigs Antwort in den Kommentaren hat mir geholfen, aber es wäre besser, sie hier als echte Antwort zu haben.
Peter K.
2
Es dauert eine Weile, bis mein Projekt erstellt ist. Sie können damit durchkommen, nur die 1-4 Objektdateien zu löschen, die beschädigt werden, wenn Sie den Build abnormal und nicht alles stoppen.
Fernando Mazzon
20

Normalerweise füge ich der betreffenden Datei ein Leerzeichen hinzu (kann ein beliebiges Zeichen sein), entferne es und speichere es dann. Einfacher und schneller als ein sauberer Build.

Grassburrito
quelle
2
Ihre Antwort erspart mir 10 Minuten beim Wiederaufbau des Projekts! Vielen Dank
Accid Bright
8

Um dieses Problem automatisch zu beheben, Build Script Phasekann hinzugefügt werden. Gehe zu Xcode -> Dein Projekt -> Dein Ziel -> Erstellungsphasen -> + -> Neue Ausführungsskriptphase

Benennen Sie es um Xcode Link Fixund verschieben Sie es über die Compile SourcesPhase. Fügen Sie dies in den Skriptkörper ein:

# 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

Dieses Skript sucht nach Objektdateien mit der Größe Null und entfernt sie, damit die Kompilierung im nächsten Schritt erfolgreich ist.

Sie müssen dieses Skript für jedes App-Ziel hinzufügen, wenn Sie viele haben.

Die Ausführung dieses Skripts dauert ca. 0,1 Sekunden und erspart Ihnen die vollständige Neuerstellung des Projekts.

Anton Plebanovich
quelle
Es ist genial! Muss in jedem Projekt haben.
Nik Kov
7

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

Yeyimilk
quelle
5

Entfernen Sie diese Datei einfach, indem Sie cmd in Ihrer Terminal-App ausführen:

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

Harchi
quelle
1
Ich habe es auf die gleiche Weise gelöst, viel schneller als eine vollständige Reinigung / Erweiterung meines großen Projekts. Wenn ich das nächste Mal die Lösung von @Anton Plebanovich ausprobieren werde, könnte dies eine hervorragende Möglichkeit sein, dieses Update zu automatisieren.
Romano
1

Da das Erstellen eines sauberen Projekts viel zu lange dauern kann, gibt es für diejenigen, die Zugriff auf die im Cache beschädigte Datei haben, einen kürzeren Weg:

  • Datei löschen (Referenz entfernen)
  • Projekt erstellen
  • Datei erneut einfügen
  • Projekt erstellen

Vollversion, damit Sie die Datei problemlos finden können:

  • Suchen Sie die Datei im Xcode-Projektnavigator
  • Klicken Sie mit der rechten Maustaste auf die Datei und drücken Sie "Im Finder anzeigen" (öffnet einen Finder an der Stelle, an der sich die Datei befindet).
  • Wählen Sie die Datei in Xcode aus und drücken Sie die Rücktaste. Klicken Sie dann auf "Referenz entfernen".
  • Projekt erstellen (es wird fehlschlagen, aber warten, bis es fertig ist)
  • Fügen Sie die Datei erneut ein, indem Sie sie aus dem Finder an die Stelle ziehen, an der Sie sie gerade gelöscht haben
  • Projekt erstellen (sollte jetzt funktionieren)
Matic Oblak
quelle
1

Sie können einfach die Datei TWRAppDelegate.o löschen und den Build fortsetzen. Kopieren Sie den in der Fehlermeldung genannten vollständigen Pfad und fügen Sie ihn hinter einem 'rm'-Befehl in Ihr Terminal ein. Es ist nicht erforderlich, abgeleitete Daten zu bereinigen / neu zu erstellen, abgeleitete Daten zu löschen, die Datei zum Projekt hinzuzufügen / daraus zu entfernen usw.

Jason Pepas
quelle
1

Schnelle Möglichkeit, Fehler zu beheben, ohne den Cache vollständig zu bereinigen:

  1. Öffnen Sie die fehlerhaft beschriebene Datei (bei dieser Frage TWRAppDelegate )
  2. cmd + A.
  3. cmd + X.
  4. Wiederaufbau - fehlgeschlagen
  5. cmd + V.
  6. Wiederaufbau - erfolgreich
Vadim Akhmerov
quelle
-1

Schritt 1. Gehen Sie zu: Projekt> Build-Einstellungen> Suchpfade

Schritt 2. Setzen Sie "Immer nach Benutzerpfaden suchen" auf "Ja"

Schritt 3. Erstellen Sie das Projekt (Sie erhalten eine Warnung, aber das Projekt wird erstellt.)

Schritt 4. Setzen Sie "Immer nach Benutzerpfaden suchen" auf "Nein" und erstellen Sie erneut, um die Warnung zu beseitigen

tland
quelle
Kann dies nur für andere hinzufügen, die diese Antwort finden. "Immer Benutzerpfad suchen" ist ab Xcode 8.3 veraltet und in der Dokumentation heißt es auch "Deaktivieren wird dringend empfohlen." (Dh es auf NEIN setzen)
Groot
-1

Eine saubere Neuerstellung war in meinem Fall nicht möglich, daher erkläre ich, wie ich das Problem gelöst habe:
- Verweis auf die Datei entfernt (Datei nicht löschen)
- Datei erneut zum Projekt hinzufügen und ausführen

David Santiago
quelle
Eine negative Abstimmung bedarf einer Erklärung, sie hat bei mir funktioniert und kann bei jedem anderen funktionieren
David Santiago