Kesalahan Xcode linker: file terlalu kecil untuk arsitektur x86_64

89

Saya sedang mengembangkan aplikasi di Xcode.

Ketika saya mencoba membangun, kesalahan ini muncul:

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)

Apakah ada yang tahu apa yang salah?

tbodt
sumber
59
Coba rekondisi / bersihkan sepenuhnya. Ada kemungkinan bahwa build sebelumnya telah dibatalkan secara tidak normal, sehingga TWRAppDelegate.ofile tersebut rusak atau berukuran nol.
Martin Baulig
5
Sedikit precisation: Anda melakukannya dengan cmd + shift + k, jika itu tidak berhasil, masuk ke folder data turunan dan hapus folder yang dinamai sebagai proyek Anda.
Ramy Al Zuhouri
3
@RamyAlZuhouri: Tidak perlu lagi membuang folder build sendiri. Tahan Option dan perintah Clean (yang ada di menu Product) berubah menjadi "Clean Build Folder ...", yang melakukannya untuk Anda.
Peter Hosey
Saran Martin Baulig memecahkan masalah saya. Terima kasih!
tbodt
2
@Peteran Ini memberi saya lencana perak Pertanyaan Bagus :-)
tbodt

Jawaban:

192

Mencuri jawaban @ martin-baulig:

Coba rekondisi / bersihkan sepenuhnya. Ada kemungkinan bahwa build sebelumnya telah dibatalkan secara tidak normal, meninggalkan file TWRAppDelegate.o rusak atau berukuran nol.

Peter K.
sumber
7
Akhirnya! Anda pantas mendapatkannya.
tbodt
Terima kasih! :-) Ya, jawaban @ martin-bailig di kolom komentar membantu saya, tapi akan lebih baik jika di sini sebagai jawaban yang sebenarnya.
Peter K.
3
Proyek saya membutuhkan waktu untuk dibangun. Anda bisa lolos dengan hanya menghapus 1-4 file objek yang rusak jika Anda menghentikan build secara tidak normal, bukan semuanya.
Fernando Mazzon
22

Saya biasanya menambahkan spasi (bisa berupa karakter apa saja) ke file yang dimaksud, hapus lalu simpan. Lebih mudah dan lebih cepat daripada bangunan yang bersih.

grassyburrito
sumber
3
Jawaban Anda menghemat 10 menit saya untuk membangun kembali proyek! Terima kasih
Accid Bright
Jawaban ini harus menjadi yang teratas!
Ting Yi Shih
8

Untuk memperbaiki masalah ini secara otomatis Build Script Phase dapat ditambahkan. Goto Xcode -> Proyek Anda -> Target Anda -> Build Phases -> + -> New Run Script Phase

Ubah namanya menjadi Xcode Link Fixdan pindahkan ke atas Compile Sourcesfase. Tempel ini ke dalam badan skrip:

# 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

Skrip ini memeriksa file objek dengan ukuran nol dan menghapusnya sehingga ketika kompilasi selesai di langkah berikutnya, itu berhasil.

Anda perlu menambahkan skrip ini untuk setiap target aplikasi jika Anda punya banyak.

Skrip ini membutuhkan ~ 0,1 detik untuk dijalankan dan menyelamatkan Anda dari pembangunan kembali proyek penuh.

Anton Plebanovich
sumber
Ini jenius! Perlu ada di setiap proyek.
Nik Kov
7

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

yeyimilk
sumber
5

hapus saja file ini dengan menjalankan cmd di aplikasi terminal Anda:

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

haithngn.dll
sumber
1
Saya menyelesaikannya dengan cara yang sama, jauh lebih cepat daripada pembersihan / pembangunan penuh pada proyek besar saya. Lain kali saya akan mencoba solusi @Anton Plebanovich, ini bisa menjadi cara terbaik untuk mengotomatiskan perbaikan ini.
Romano
2

Cara cepat untuk memperbaiki kesalahan tanpa pembersihan cache lengkap:

  1. Buka file yang dijelaskan dalam kesalahan (dalam kasus pertanyaan ini TWRAppDelegate)
  2. cmd + A
  3. cmd + X
  4. Bangun kembali - gagal
  5. cmd + V
  6. Bangun kembali - berhasil
Vadim Akhmerov
sumber
1

Karena membangun proyek yang bersih mungkin memakan waktu terlalu lama, ada cara yang lebih singkat bagi mereka yang memiliki akses ke file yang rusak di cache:

  • Hapus file (Hapus referensi)
  • Bangun proyek
  • Masukkan kembali file
  • Bangun proyek

Versi lengkap sehingga Anda tidak kesulitan menemukan file:

  • Temukan file di navigator proyek Xcode
  • Klik kanan file tersebut dan tekan "show in finder" (membuka finder di lokasi file tersebut)
  • Pilih file di Xcode dan tekan backspace lalu klik "Hapus referensi"
  • Bangun proyek (itu akan gagal tapi tunggu sampai selesai)
  • Masukkan kembali file dengan menyeretnya dari finder ke lokasi yang sama yang baru saja Anda hapus
  • Bangun proyek (harus bekerja sekarang)
Matic Oblak
sumber
1

Anda cukup menghapus file TWRAppDelegate.o dan melanjutkan pembuatan Anda. Salin jalur lengkap yang disebutkan dalam pesan kesalahan dan tempel di belakang perintah 'rm' di terminal Anda. Tidak perlu membersihkan / membangun kembali, menghapus data turunan, menambah / menghapus file dari proyek, dll.

Jason Pepas
sumber
-1

Langkah 1. Buka: Project> Build Settings> Search Paths

Langkah 2. Setel "Selalu Telusuri Jalur Pengguna" ke Ya

Langkah 3. Bangun proyek (Anda akan mendapat peringatan tetapi proyek akan dibangun.)

Langkah 4. Setel "Selalu Telusuri Jalur Pengguna" kembali ke Tidak dan buat lagi untuk menghilangkan peringatan

tland
sumber
Bisa menambahkan ini untuk orang lain yang menemukan jawaban ini. "Always Search User Path" sudah tidak digunakan lagi sejak Xcode 8.3 dan dari dokumentasi juga tertulis "Sangat disarankan untuk menonaktifkannya." (Yaitu mengaturnya ke TIDAK)
Groot
-1

Membangun kembali bersih tidak dalam kasus saya jadi saya menjelaskan bagaimana saya menyelesaikan masalah:
- Referensi yang dihapus ke file tersebut (jangan hapus file)
- Tambahkan file ke proyek lagi dan jalankan

David Santiago
sumber
Suara negatif memerlukan penjelasan, itu berhasil untuk saya dan bisa berhasil untuk orang lain
David Santiago