Kegagalan pembuatan Xcode “Simbol yang tidak terdefinisi untuk arsitektur x86_64”

168

Pertanyaan pemula Xcode:

Ini adalah pengalaman pertama saya dengan Xcode 4.6.3.

Saya mencoba untuk menulis program konsol yang sangat sederhana, yang mencari perangkat BT berpasangan dan mencetaknya ke NSLog.

Itu dibangun dengan kesalahan berikut:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_IOBluetoothDevice", referenced from:
      objc-class-ref in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Saya mencari seperti orang gila. Masalah umum harus menjadi referensi ke file, yang hanya file header yang diimpor dan tidak ada implementasi (* .m-file) ditemukan oleh linker. Namun perpustakaan IOBluetooth, Kerangka kerja standar seperti Kerangka Kerja Yayasan.

Apa yang saya lewatkan dalam pernyataan saya di atas?

Saya juga telah mencoba membangunnya untuk mesin 32-bit (build gagal lagi). Ini jelas merupakan kesalahan linker, namun saya tidak tahu, apa hubungannya, kecuali bahwa ada masalah dengan menemukan implementasi untuk IOBluetoothDevice, pada arsitektur x86 dan x64, sedangkan file header berasal dari standar termasuk Kerangka, yang disebut IOBluetooth?

Untuk informasi Anda, kode utama saya "main.m" adalah:

#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>          // Note the import for bluetooth
#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h>   // Note the import for bluetooth


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        IOBluetoothDevice *currentDevice;
        NSArray *devices = [ IOBluetoothDevice pairedDevices];


        for (id currentDevice in devices){
          NSLog(@"%i : %@",[ currentDevice classOfDevice ], [ currentDevice name ]);    
        }
    }
    return 0;
}

Terima kasih atas bantuan atau petunjuk ke arah yang benar.

Matahari terbit
sumber
17
Coba tambahkan $(inherited)ke Bendera Penghubung Lainnya , bersihkan dan bangun.
Resty
1
Ketika saya menemukan ini, saya menemukan bahwa saya harus pergi ke File Inspector untuk file m dan centang kotak di bawah Target Membership untuk mengekspor (?) Ke modul tempat saya mencoba menggunakannya.
Landon Kuhn

Jawaban:

123

Sepertinya Anda tidak ada, termasuk IOBluetooth.framework dalam proyek Anda. Anda dapat menambahkannya dengan:

-Klik pada proyek Anda di kiri atas panel kiri (ikon biru).

-Dalam panel tengah, klik pada tab Build Phases.

-Di Bawah "Tautan Biner Dengan Perpustakaan", klik tombol plus.

-Cari IOBluetooth.framework dari daftar dan tekan Add.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ini akan memastikan bahwa definisi IOBluetooth.framework ditemukan oleh tautan. Anda dapat melihat bahwa kerangka kerja adalah anggota target Anda dengan mengklik kerangka kerja di panel kiri dan melihat keanggotaan target kerangka kerja di panel kanan (perhatikan saya telah memindahkan kerangka kerja di bawah grup Kerangka untuk tujuan organisasi):

masukkan deskripsi gambar di sini

Chris Livdahl
sumber
3
Berhasil! Terima kasih banyak juga untuk upaya mengambil tangkapan layar!
RisingSun
Hal yang sama berfungsi dengan baik untuk framework oAuthIOS. Tambahkan kerangka oAuthIOS dari folder pods ke proyek root yang Anda coba bangun
prodeveloper
1
Saya mencari IOBluetooth.framework, tetapi tidak ada di sana: S
Menno van der Krift
Aneh, seharusnya ada di sana.
Chris Livdahl
Luar biasa! Menyelamatkan saya beberapa jam!
Bravo Kevin
49

UPD

Apple mengharuskan untuk menggunakan arsitektur arm64 . Jangan gunakan pustaka x32 di proyek Anda

Jadi jawaban di bawah ini tidak benar lagi!


Jawaban lama

Xcode 5.1 baru menetapkan arsitektur armv7, armv7s, dan arm64 sebagai default.

Dan kadang-kadang kesalahan "kegagalan pembangunan" Simbol tidak terdefinisi untuk arsitektur x86_64 "" mungkin disebabkan oleh ini. Karena, beberapa lib (bukan Apple) awalnya dikompilasi untuk x32 dan tidak mendukung x64.

Jadi yang Anda butuhkan, adalah mengubah "Arsitektur" untuk target proyek Anda seperti ini

NB. Jika Anda menggunakan Cocoapods - Anda harus melakukan hal yang sama untuk target "Pods".

masukkan deskripsi gambar di sini

Aleksey Potapov
sumber
3
Pada dasarnya saya menghapus arm64 thingy dari properti Arsitektur Valid. Maka seperti yang ditunjukkan di atas, itu akan dipaksa hanya untuk melihat apa yang ada di arsitektur yang valid kurasa!
Randika Vishman
@ Wisman, hai! Ada jawaban SO yang bagus yang mencakup perbedaan antara Valid Architecturesdan Architectures.
Aleksey Potapov
Memperbaiki kesalahan terkait saya di Xcode 5 ketika saya mencoba menjalankan proyek di iOS 7.1 simulator, di iOS 6.x simulator itu bekerja dengan baik secara default, thx :)
Zsivics Sanel
@BraveS: Dengan menghapus arsitektur arm64, apakah itu akan berfungsi untuk perangkat 64-bit?
Jayprakash Dubey
1
@JayprakashDubey hai saya mengunggah aplikasi bawaan di dalam tanpa dukungan 64bit mereka menolak aplikasi saya. Ketika saya mencoba untuk menambahkan arm64 saya menghadapi kegagalan build error "Simbol tidak terdefinisi untuk arsitektur x86_64". jika saya menghapus arm64 dari arsitektur. dan saya meletakkan arm64 dalam arsitektur yang valid. Apakah aplikasi saya disetujui ???
SP Balu Kommuri
31

Simbol yang tidak terdefinisi untuk arsitektur x86_64: "_OBJC_CLASS _ $ _ xxx", dirujuk dari: objc-class-ref di yyy.o

Ini umumnya berarti, Anda memanggil "xxx" (mungkin kerangka kerja atau kelas) dari kelas "yyy". Kompilator tidak dapat menemukan "xxx" sehingga kesalahan ini terjadi.

Anda perlu menambahkan file yang hilang (dalam hal ini "xxx") dengan mengklik kanan pada folder proyek Anda di jendela navigator dan mengetuk opsi " Tambahkan file ke" YourProjectName " ".

Jendela sembulan akan membuka file proyek Anda di Finder. Di sana, Anda dapat melihat file yang hilang dan hanya menambahkannya ke proyek Anda. Jangan lupa untuk mencentang kotak " Salin item jika perlu ". Semoga berhasil!!

Bingung
sumber
17

Saya juga telah melihat kesalahan ini pada Xcode 7.2 ketika data yang diturunkan menjadi rusak (dalam kasus saya, saya menginterupsi build dan mencurigai itu adalah akar penyebabnya).

Jadi jika solusi lain (terutama Chris dan BraveS yang saya duga lebih mungkin) tidak cocok dengan masalah Anda, coba hapus data turunan (Pilih: Jendela / Proyek / Data Turunan -> Hapus) dan bangun kembali.

(Ditambahkan untuk referensi oleh orang lain - Saya tahu pertanyaan asli telah dijawab dengan benar).

Ali Beadle
sumber
14

Di bawah Xcode 9.0b5 Anda mungkin menemukan ini karena Xcode 9.0b5 memiliki bug di dalamnya ketika Anda menambahkan kode sumber, itu tidak memenuhi pengaturan target. Anda harus masuk dan menetapkan target masing-masing file secara manual kata penutup:

Proyek Xcode dengan ilustrasi keanggotaan target manual

William Cerniuk
sumber
13

Dalam Kasus saya, itu bukan perpustakaan, itu beberapa kelas ..

Simbol yang tidak
terdefinisi untuk arsitektur x86_64: "_OBJC_CLASS _ $ _ ClassNmae", dirujuk dari: objc-class-ref di SomeClassName "....

d: simbol tidak ditemukan untuk arsitektur x86_64

clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat doa)

Solusi Saya punya beberapa target di Xcode dengan beberapa skema (Produksi, Dev dll) .. beberapa implementasi saya yang baru ditambahkan (Class.m) tidak ada di

Xcode-> Target-> Bangun Fase-> Kompilasi Sumber

Jadi saya harus menambahkannya secara manual.

maka saya bisa mengkompilasi & membangun dengan sukses.

Udaya Sri
sumber
ini memecahkan masalah saya. Saya menggunakan kerangka kerja dinamis. Hal lain adalah saya tidak suka ide untuk menambahkan secara manual.
toxicsun
9

Saya juga mengalami masalah yang sama, metode di atas tidak akan berfungsi. Saya tidak sengaja menghapus file di direktori berikut ini. masukkan deskripsi gambar di sini

Atau

~ / Perpustakaan / Pengembang / Xcode / DerivedData /

masukkan deskripsi gambar di sini

ylgwhyh
sumber
4
Bagi mereka yang bertanya-tanya apa path / perintah yang sebenarnya: itu ~/Library/Developer/Xcode/DerivedData/ melalui CLI Anda dapat membersihkan direktori sebagai berikut:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

Saat memperbarui ke Xcode 7.1, Anda mungkin melihat jenis kesalahan ini, dan itu tidak bisa diselesaikan dengan jawaban di atas. Salah satu gejala dalam kasus saya adalah aplikasi berjalan di perangkat bukan di simulator. Anda mungkin akan melihat sejumlah besar kesalahan terkait dengan hampir semua kerangka kerja yang Anda gunakan.

Cara mengatasinya sebenarnya cukup sederhana. Anda hanya perlu menghapus entri dari pengaturan "Jalur Pencarian Kerangka", ditemukan di TARGET Anda> Bangun Pengaturan> bagian Jalur Pencarian (pastikan tab "Semua" dipilih)

masukkan deskripsi gambar di sini

Jika Anda melihat entri lain di sini (selain $ (diwariskan)) untuk target utama Anda atau target pengujian Anda, hapus saja jalur yang salah dari semua target dan buat kembali.

whyoz
sumber
5

Saya telah menemukan ini juga dapat terjadi jika Anda menyeret folder dengan file Objective-C ke proyek Anda. Jika folder itu muncul biru saya pikir itu menunjukkan tidak terhubung dengan benar. Anda dapat memverifikasi ini (jika Anda menggunakan kontrol versi) karena setiap kali Anda menambahkan file baru file pbxproj harus diperbarui dengan tautan ke file-file baru itu. Namun Anda mungkin menemukan bahwa setelah Anda menambahkan folder bahwa file pbxproj tidak berubah (dan karenanya ada kesalahan penautan). Jadi Anda akan mendapatkan pelengkapan otomatis yang berfungsi dan akan menemukan kelas yang Anda impor, tetapi ketika benar-benar membangun gambar itu gagal dengan kode kesalahan ini.

Solusinya adalah tidak menambahkan folder melainkan menambahkan file. Lakukan ini dan Anda akan melihat pembaruan file pbxproj dan itu harus memperbaiki kesalahan ini.

Ini juga mengasumsikan Anda telah melakukan apa yang disarankan di atas dan telah menautkan dengan benar semua kerangka kerja yang benar.

Agresor
sumber
5

Saya mencoba hampir semua yang ada di sini, tetapi masalah saya ternyata adalah sisa-sisa cocoapod sebelumnya. Apa yang berhasil untuk saya adalah:

  1. rm -Rf Pods; pod install
  2. Hapus Data Berasal (Jendela / Proyek ... pilih target Anda. Klik Tombol Hapus)
  3. Membangun kembali
kesendirian
sumber
4

Saya memiliki kesalahan yang sama, karena alih-alih menghapus file saya hanya menghapus referensi untuk itu. Menemukan file di Finder dan menghapusnya membantu.

Alatoo
sumber
3

Saya tahu ini adalah pertanyaan lama tetapi hari ini mendapatkan kesalahan yang sama dan tidak ada solusi di atas yang berhasil.

Namun sudah diperbaiki dengan menetapkan opsi:

Project -> Architecture -> Build Active Architecture Only

ke Ya

dan proyek menyusun dan membangun dengan benar

Raphael
sumber
3

Saya telah menghadapi masalah ini berkali-kali. Ini biasanya muncul ketika Anda menghapus folder build Anda.

Solusi mudahnya adalah de-integrasi dan menginstal file pod lagi.

pod deintegrate
pod install
Anirudha Mahale
sumber
2

Jika Anda mendapatkan kesalahan ini saat mencoba menautkan ke file C, periksa dulu nama fungsi untuk kesalahan ketik. Berikutnya, periksa kembali bahwa Anda tidak mencoba memanggil fungsi C dari lingkungan C ++ / Objective-C ++ tanpa menggunakan extern C {}konstruk. Saya merobek rambut saya karena saya memiliki kelas yang ada dalam file .mm yang mencoba memanggil fungsi C. Ini tidak berfungsi karena di C ++, simbol-simbolnya hancur. Anda benar-benar dapat melihat simbol konkret yang dihasilkan menggunakan alat nm. Terminal ke jalur file .o, dan jalankan nm -gdi file yang memanggil simbol dan yang harus memiliki simbol, dan Anda akan melihat apakah mereka cocok atau tidak, yang dapat memberikan petunjuk untuk kesalahan.

nm -g file.o

Anda dapat memeriksa simbol C ++ yang diuraikan dengan cara ini:

nm -gC file.o
james_alvarez
sumber
2

Dalam kasus saya, saya membangun kerangka kerja kustom dengan target Penerapan yang ditetapkan ke 9.1, tetapi target Penerapan aplikasi saya lebih rendah, yang mendukung 8.1. Perkecil kerangka kerja kustom Target penyebaran memecahkan masalah saya.

jeffreysuej
sumber
2

Saya terlambat ke pesta tetapi berpikir untuk berbagi satu skenario lagi di mana ini bisa terjadi. Saya sedang mengerjakan suatu kerangka kerja dan mendistribusikannya di atas cocoapods. Kerangka kerja ini memiliki kelas dan protokol objektif c dan swift dan itu berhasil dibangun. Saat menggunakan pod dalam kerangka kerja lain atau proyek itu memberikan kesalahan ini karena saya lupa menyertakan file .m di podspec. Harap sertakan file .swtift, .h, dan .m di sumber podspec Anda seperti di bawah ini: s.source_files = "Projectname / Projectname / ** / *. {Swift, h, m}"

Saya harap ini menghemat waktu orang lain.

Pranav Gupta
sumber
2

Saya menyelesaikannya dengan menambahkan "-lc ++" di Other Linker Flags di Build Settings.

Krishna Mudhiraj
sumber
1

Bagi saya, ini mulai terjadi setelah menggabungkan konflik.

Saya mencoba membersihkan dan menghapus build folder, tetapi tidak ada yang membantu. Masalah ini terus terjadi. Kemudian saya menautkan kembali referensi dengan menghapus grup yang bermasalah dan ditambahkan kembali ke proyek dan itu berhasil.

green0range
sumber
1

Bisa juga berupa #include <windows.h>file .c yang Anda coba kompilasi.

Lorenzo Andraghetti
sumber
1

dalam kasus saya, saya harus menambahkan

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
ke podfile saya dan kemudian hapus direktori / Pods dan jalankan `pod install`

(Xcode 10.1)

Brooks DuBois
sumber
1

Ini mungkin membantu seseorang. Butuh waktu berhari-hari untuk akhirnya mengetahuinya. Saya bekerja di OBJ-C dan saya pergi ke:

Project-> Build Phases-> Compile sourcesdan menambahkan VC.mfile baru yang baru saja saya tambahkan.

Saya bekerja dengan kode lawas dan saya biasanya cepat, baru untuk OBJ-C jadi saya bahkan tidak berpikir untuk mengimpor .mfile saya ke perpustakaan sumber.

EDIT:

Berlari ke masalah ini untuk kedua kalinya dan itu adalah sesuatu yang lain. Jawaban ini menyelamatkan saya setelah 5 jam debugging. Sudah mencoba semua opsi di utas ini dan lainnya. https://stackoverflow.com/a/13625967/7842175 Tolong beri dia kredit jika ini membantu Anda, tetapi pada dasarnya Anda mungkin perlu mengatur file Anda ke target di inspektur file.

Ini adalah inspektur file Anda, pastikan semua target yang Anda butuhkan "dicentang"

Secara keseluruhan, ini adalah kode Kesalahan yang sangat tidak jelas yang dapat disebabkan oleh banyak alasan, jadi teruslah mencoba berbagai opsi.

valeriana
sumber
1

Kadang, saya lupa menyalin pustaka dari Release-universal dan secara keliru menyalin dari Release-iphoneos. Biasanya Release-iphoneos berisi file .a yang telah dipangkas untuk X86. dan itu memberikan kesalahan.

Saleh Enam Shohag
sumber
1

dalam kasus saya, hapus pilihan keanggotaan target dan kemudian pilih lagi memperbaiki masalah.

Periksa jawaban William Cerniuk dengan foto lampiran.

pengguna1105951
sumber
0

Dalam kasus saya masalah dikompilasi kerangka arsitektur.
Saya menjalankan Xcode 11 dan menggunakan Swift 5.1

  • Saya punya 3 target seperti:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Saya mencoba menjalankan tes tetapi produk MyAppFrameWork dikompilasi untuk Perangkat iOS Generik dan target Uji memerlukan lengan x86-64, Jadi saya membangun kembali Kerangka untuk Simulator iOS dan uji kasus yang berhasil mulai berjalan.

Mohammad Reza Koohkan
sumber