simbol tidak ditemukan untuk arsitektur i386

113

Saat mencoba mengompilasi dengan Xcode, saya mendapatkan kesalahan berikut:

  **Ld /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher normal i386
    cd /Users/doronkatz/Sites/xCode/iKosher
    setenv MACOSX_DEPLOYMENT_TARGET 10.6
    setenv PATH "/Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Xcode4/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Xcode4/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Xcode4/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk -L/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -L/Users/doronkatz/Sites/xCode/iKosher -F/Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator -filelist /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Intermediates/iKosher.build/Debug-iphonesimulator/iKosher.build/Objects-normal/i386/iKosher.LinkFileList -mmacosx-version-min=10.6 -all_load -ObjC -Xlinker -objc_abi_version -Xlinker 2 -lz -framework Security -framework CFNetwork -framework CoreData -framework Foundation -framework UIKit -framework CoreGraphics -framework QuartzCore -o /Users/doronkatz/Library/Developer/Xcode/DerivedData/iKosher-bphnihrngmqtkqfgievrrumzmyce/Build/Products/Debug-iphonesimulator/iKosher.app/iKosher

Undefined symbols for architecture i386:
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassMIMEType", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_kUTTagClassFilenameExtension", referenced from:
      +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[Reachability startNotifier] in Reachability.o
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[Reachability stopNotifier] in Reachability.o
  "_SCNetworkReachabilityCreateWithName", referenced from:
      +[Reachability reachabilityWithHostName:] in Reachability.o
  "_SCNetworkReachabilityCreateWithAddress", referenced from:
      +[Reachability reachabilityWithAddress:] in Reachability.o
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[Reachability currentReachabilityStatus] in Reachability.o
      -[Reachability isReachable] in Reachability.o
      -[Reachability isConnectionRequired] in Reachability.o
      -[Reachability isConnectionOnDemand] in Reachability.o
      -[Reachability isInterventionRequired] in Reachability.o
      -[Reachability isReachableViaWWAN] in Reachability.o
      -[Reachability isReachableViaWiFi] in Reachability.o
      ...
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status**

Tidak yakin apa artinya.

Doz
sumber

Jawaban:

92

Jika Anda mendapatkan hal semacam ini muncul tiba-tiba, itu biasanya berarti proyek tersebut kehilangan beberapa kerangka kerja yang dibutuhkannya. Perpustakaan dan proyek dependen dapat memerlukan kerangka kerja, jadi jika Anda baru saja menambahkan satu kerangka kerja maka itu dapat menyebabkan kesalahan ini.

Untuk menambahkan kerangka kerja, klik kanan pada nama proyek di tampilan proyek, pilih Add, lalu pilih Existing frameworks...dari daftar. Kemudian temukan kerangka kerja dengan simbol yang Anda lewatkan.

Mengenai bagaimana Anda menemukan kerangka kerja yang Anda butuhkan, menurut saya menggunakan google adalah yang paling mudah, meskipun Anda mungkin juga dapat menggunakan pencarian bantuan Xcode. Cari salah satu simbol, lakukan yang terbaik untuk menentukan nama yang tidak berubah (mis., SCNetworkReachabilityGetFlags), Lalu tautan dokumentasi pertama yang Anda temukan di developer.apple.com sering kali adalah yang benar. Anda biasanya tidak perlu berburu terlalu jauh. Dalam hal ini, itu adalah halaman ini:

https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Kemudian di bagian atas halaman, ini memberi tahu Anda kerangka kerja mana yang akan digunakan, SystemConfigurationdalam kasus ini. Jadi tambahkan itu ke proyek, dan kompilasi lagi.

Kemudian terus lakukan ini sampai berhasil ...

Sunting: Saya tidak pernah menggunakan simulator, tetapi ini yang Anda lakukan pada perangkat - saya berasumsi itu sama ...

Cœur
sumber
64

Terkadang ada file sumber yang hilang dari target Anda.

  1. periksa simbol mana yang hilang
  2. target-> fase build-> kompilasi sumber
  3. tambahkan file sumber yang hilang jika tidak terdaftar
  4. command + b untuk kebahagiaan

Anda dapat memilih file yang tampaknya "hilang" dan memeriksa di bilah utilitas sebelah kanan bahwa kotak centangnya dipilih untuk Target yang Anda buat.

Nir Pengas
sumber
1
Hal ini sering terjadi saat menggabungkan dua file proyek secara tidak bersih dan keanggotaan target hilang.
Steven Hepting
1
Terima kasih banyak, entah bagaimana xcode tidak menambahkan file .m yang diperlukan ke tahap fase pembuatan!
dreampowder
1
Terima kasih :) Tambahkan 2 file ke proyek dan hanya setelah melakukan langkah-langkah itu semuanya baik
pengguna1105951
32

Saya menyelesaikannya menggunakan metode berikut (untuk XCode 4):

1) Pilih proyek di jendela navigasi proyek yang akan menampilkan ringkasan proyek di sebelah kanan

2) Pilih fase pembuatan tab ke-4

3) Pilih Link binary with library option

4) Tambahkan kerangka kerja yang Anda peroleh

5) Pindahkan kerangka dari folder utama ke folder kerangka kerja

6) Bangun lagi dan kesalahan hilang.

Pruthvid
sumber
Terima kasih. Saya menemukan jawaban ini untuk mencari MFMailCompose, dan diselesaikan dengan menambahkan MessageUI.framework
Frank Yin
17

Masalahnya adalah bahwa keanggotaan target untuk file yang ditambahkan hilang ke target aplikasi. Jadi pilih file dan tambahkan tanda centang ke kotak keanggotaan target

Misalnya jika kesalahan ditampilkan dalam definisi metode yang samamasukkan deskripsi gambar di sini

Lithu TV
sumber
Saya mendapat kesalahan Simbol Tidak Ditemukan ini tetapi situasinya jauh lebih sederhana. Saya menambahkan modul baru (file) dengan satu fungsi baru yang saya perlukan ke salah satu Skema saya. Ketika saya membangun skema yang berbeda beberapa minggu kemudian, panggilan ke fungsi itu tidak ditemukan. Menambahkannya ke target adalah semua yang dibutuhkan.
Akankah
17

Berpikir untuk menambahkan solusi saya untuk ini, setelah menghabiskan beberapa jam pada kesalahan yang sama :(

Orang-orang di atas benar bahwa hal pertama yang harus Anda periksa adalah apakah Anda melewatkan menambahkan kerangka kerja apa pun, lihat langkah-langkah yang disediakan oleh Pruthvid di atas.

Masalah saya, ternyata, adalah kelas kompilasi yang hilang setelah saya menghapusnya, dan kemudian menambahkannya kembali.

Periksa "Sumber Kompilasi" Anda seperti yang ditunjukkan untuk kelas kesalahan yang dilaporkan. Tambahkan kelas yang hilang yang Anda buat.

justinkoh
sumber
2
TERIMA KASIH ... Ini berhasil untuk saya. Saya menerapkan kelas khusus. Telah menyalin kedua kelas khusus tersebut. h dan .m ke dalam proyek. Melakukan #import padanya, tetap saja kesalahannya keluar. Menambahkan kelas khusus '.m ke dalam bagian "Sumber Kompilasi" menyelesaikannya!
GeneCode
Hebat! Saya memiliki masalah yang sama dengan Rocotilos, saya mengimpor kelas khusus, mengimpor, tetapi masih memiliki masalah. Ini berhasil! Terima kasih banyak!
Souleiman
8

Pastikan framework yang hilang benar-benar terdaftar di bawah "Target / Build Phases / Link Binary With Libraries" jika tidak hanya menambahkannya. Seperti yang disebutkan sebelumnya, ini biasanya menunjukkan kerangka yang hilang.

Dalam proyek saya ada dua kerangka identik yang terdaftar, ketika saya menghapus salah satunya saya mengalami kesalahan ini, karena itu juga menghapusnya dari daftar "Tautan Biner Dengan Perpustakaan". Saya menambahkan kembali dan masalahnya hilang (dan saya masih memiliki dua kerangka kerja yang terdaftar)

Tibidabo
sumber
6

Saya memperbaiki kesalahan serupa pada proyek saya dengan mengubah Pengaturan Build> Arsitektur untuk SEMUA target saya.

Masalahnya: Ketika saya memutakhirkan dari Xcode 4.4 ke Xcode 4.5, proyek saya masih terkompilasi dengan baik di simulator tetapi tidak dapat dikompilasi pada perangkat. Pada perangkat, ia menampilkan kesalahan "simbol tidak ditemukan untuk armv7 arsitektur", bersama dengan "Kesalahan Apple Mach-O Linker" yang menyesatkan dan "clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat permintaan ). "

Penyebabnya (dalam kasus saya): Proyek saya memiliki beberapa target, dan meskipun Build Settings> Architectures untuk target utama ditetapkan untuk menyertakan arsitektur armv7s, target utama bergantung pada target lain (tercantum di bawah Build Phases> Dependencies), dan Saya tidak berpikir untuk mengatur ulang Pengaturan Build> Arsitektur untuk target lain itu, dan saya harus mengubahnya untuk menyertakan armv7s. Saya kira simulator dan perangkat berjalan pada arsitektur yang berbeda, dan itulah mengapa simulator baik-baik saja sedangkan perangkat tidak.

Josh
sumber
5

Apakah proyek Anda bergantung pada proyek lain, dan apakah itu target dalam proyek itu ditetapkan untuk menjadi ketergantungan langsung dari target utama Anda? Jika ini kasusnya dan dependensi tidak disiapkan, target dependen mungkin tidak dibuat untuk semua konfigurasi (yaitu simulator)

Hanya tebakan liar.

James J.
sumber
4

Situasi lain yang dapat menyebabkan masalah ini adalah jika kode Anda memanggil ke C ++, atau dipanggil dengan kode C ++. Saya mengalami masalah dengan fungsi utilitas file .c saya yang muncul sebagai "simbol tidak ditemukan" saat dipanggil dari Obj-C. Perbaikannya adalah dengan mengubah jenis file: di Xcode 4, gunakan panel info yang diperluas untuk mengatur jenis file ke "Objective-C ++ Source"; di Xcode 3, gunakan "Get Info" untuk mengubah jenis file menjadi "source.cpp.objcpp".

salah nama
sumber
4

Dalam kasus saya, tidak ada solusi yang diposting yang berfungsi. Saya harus menghapus proyek dan melakukan pembayaran baru dari server SVN . Beruntung saya proyek ini di-host dalam sistem kontrol versi. Tidak tahu apa yang akan saya lakukan sebaliknya.

otaviokz.dll
sumber
2

Dalam proyek C ++ menggunakan kelas templatized yang ditentukan , ketika menerima kesalahan yang sama, saya memilih file .cpp dengan kelas templatized yang ditentukan di Project Navigator, lalu Hapus> Hapus Referensi. Juga file .h terkait, sementara masih direferensikan dalam proyek, perlu memiliki pernyataan #include ke .cpp sebagai berikut:

#ifndef __CircularBuffer__CircularBufferT__
#define __CircularBuffer__CircularBufferT__

... snip ...

#include "CircularBufferT.cpp"
#endif /* defined(__CircularBuffer__CircularBufferT__) */

Jika Anda ingin melihat, contoh proyek sederhana ada di github :

Ini adalah sedikit tipuan tipuan dan saya tidak ingat sumber asli dari solusi ini.

vmanjz.dll
sumber
2

Jika kesalahan ini muncul tiba-tiba, itu berarti proyek kehilangan beberapa kerangka kerja. Perpustakaan dan proyek dependen dapat memerlukan kerangka kerja, jadi jika Anda baru saja menambahkan satu kerangka kerja maka itu dapat menyebabkan kesalahan ini.

Untuk menambahkan kerangka kerja, klik kanan pada nama proyek di tampilan proyek, pilih Tambah, lalu pilih Kerangka yang ada dari daftar. Kemudian temukan kerangka kerja dengan simbol yang Anda lewatkan.

Hal lainnya adalah jika Anda menambahkan kelas apa pun dalam sumber daya yang dikompilasi dan menghapus kelas itu dari proyek maka kesalahan akan muncul. Hal terbaik yang harus dilakukan adalah menghapus kelas dari sumber kompilasi (Build settings -> compile sources) yang telah dihapus dari proyek.

Dalam kasus saya, saya telah menambahkan kelas admob dalam proyek dan menyusun proyek. Dalam kasus selanjutnya saya tidak ingin memasukkan admobs dalam proyek saya jadi saya menghapus referensi kelas admob dari proyek saya. Ketika kesalahan ini terjadi, saya menghapus kelas .m admob saya dari sumber daya kompilasi memecahkan masalah ini.

Abhilash Reddy kallepu
sumber
2

Ini terjadi pada saya saat mencoba menyalin pustaka demo PSPDFKIT ke dalam proyek saya. Saya mengikuti semua instruksi di situs + semua saran di halaman ini .. untuk beberapa alasan terus memberikan kesalahan di atas, masalahnya adalah jika saya memahami pesan dalam metode kesalahan .. itu hanya muncul di biner ( jelas saya tidak memiliki akses ke kode sumber b / c saya harus membayarnya).

Saya melihat ini di halaman instruksi:

masukkan deskripsi gambar di sini

Jadi saya pergi ke isi file konfigurasi itu dan menemukan ini:

OTHER_LDFLAGS=$(inherited) -ObjC -fobjc-arc -lz -framework CoreText -framework CoreMedia -framework MediaPlayer -framework AVFoundation -framework ImageIO -framework MediaPlayer -framework MessageUI -framework CoreGraphics -framework Foundation -framework QuartzCore -framework AVFoundation -framework CFNetwork -framework MobileCoreServices -framework SystemConfiguration -weak_framework UIKit

Kemudian saya pergi ke proyek sampel yang disediakan oleh penulis perpustakaan tersebut .. dan melihat bahwa bendera sebelumnya di mana disalin kata demi kata ke bendera penaut lain dalam pengaturan build saya .. namun dalam proyek saya .. tidak! .. Jadi saya hanya menyalin dan menempelkannya ke dalam pengaturan pembangunan proyek saya, bendera penaut lain dan semuanya bekerja!

take away point: jika Anda mengandalkan beberapa file .xcconfig pada pengaturan Anda, periksa kembali dengan sumber kode sampel atau sesuatu dan pastikan bahwa itu benar-benar telah diterapkan .. itu tidak diterapkan dengan benar dalam kasus saya

biara
sumber
0

Alasan lain hal ini bisa terjadi adalah ketika Anda MENINGKATKAN SDK.

Jika Anda hanya menghapus grup, lalu menyeret dan melepaskan folder baru ke proyek, "Library Search Path" akan memiliki kedua SDK tersebut. Untuk mengatasinya, cukup hapus jalur SDK lama.

samwize
sumber
0

Saya telah menggunakan CLGeocoder tanpa menambahkan Core.Location Framework. Pada dasarnya kesalahan ini bisa berarti banyak hal. Saya harap ini membantu orang lain.

ahli logik
sumber
0

Saya pernah bingung dengan yang ini sebelumnya, hanya untuk menyadari bahwa saya menambahkan @interface hanya data dan lupa menambahkan blok @implementation yang kosong.

Steve Tranby
sumber
0

Menemukan masalah ini di Xcode 11, perbaikan telah mengubah Target Penerapan Minimum dari 10.0 menjadi 11.0, semoga ini membantu seseorang :)

VeganKid
sumber