Masalah ini telah membuatku gila, dan aku tidak tahu bagaimana cara memperbaikinya ...
Undefined symbols for architecture armv7:
"_deflateEnd", referenced from:
-[ASIDataCompressor closeStream] in ASIDataCompressor.o
"_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
objc-class-ref in ASIHTTPRequest.o
"_deflate", referenced from:
-[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
"_deflateInit2_", referenced from:
-[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
Saya pikir itu ada hubungannya dengan:
ld: symbol(s) not found for architecture armv7
Tetapi saya telah menambahkan: libz.1.2.3.dylib
dan itu tidak membantu, ada yang punya ide?
-ObjC
bendera penghubung lainnya dan Obj-C dari pustaka statis eksternal yang Anda gunakan yang seharusnya tidak terlihat (seperti dari Parse), terlihat. Lihat jawaban saya jika ini masalahnya: stackoverflow.com/a/26151208/901641nm -g
di 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 diurai dengan ini: nm -gC file.oUndefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
Jawaban:
Penyebab umum
Penyebab umum untuk "Simbol yang tidak terdefinisi untuk arsitektur armv7" adalah:
Anda mengimpor header dan tidak menautkan ke perpustakaan yang benar . Ini umum, terutama untuk header untuk perpustakaan seperti QuartzCore karena tidak dimasukkan dalam proyek secara default. Untuk menyelesaikan:
Tambahkan pustaka yang benar di
Link Binary With Libraries
bagianBuild Phases
.Jika Anda ingin menambahkan pustaka di luar jalur pencarian default, Anda dapat memasukkan path dalam
Library Search Paths
nilai dalam Build Settings dan menambahkan-l{library_name_without_lib_and_suffix}
(mis. Untuk penggunaan libz.a-lz
) keOther Linker Flags
bagianBuild Settings
.Anda menyalin file ke proyek Anda tetapi lupa memeriksa target untuk menambahkan file . Untuk menyelesaikan:
Build Phases
untuk target yang benar, perluasCompile Sources
dan tambahkan.m
file yang hilang . Jika ini adalah masalah Anda, harap berikan jawaban Cortex di bawah ini juga.Anda menyertakan perpustakaan statis yang dibangun untuk arsitektur lain seperti i386, simulator di mesin host Anda. Untuk menyelesaikan:
Jika Anda memiliki beberapa file perpustakaan dari vendor perpustakaan Anda untuk dimasukkan dalam proyek Anda harus memasukkan satu untuk simulator (i386) dan satu untuk perangkat (armv7 misalnya).
Secara opsional, Anda bisa membuat perpustakaan statis yang berisi kedua arsitektur.
Jawaban asli:
Anda belum tertaut dengan file libz yang benar. Jika Anda mengklik kanan file tersebut dan mengungkapkan di finder, pathnya harus berada di suatu tempat di folder sdk iOS. Ini milik saya misalnya
Saya sarankan menghapus referensi dan kemudian menambahkannya kembali di bagian Binary With Libraries Bangun Fase dari target Anda.
sumber
-framework <FrameWorkName>
. Saya punya masalah dengan XCTest, jadi saya harus menambahkan-framework XCTest
. Terima kasih! :)Saya memiliki masalah yang sama tadi malam dan masalahnya, terkait dengan fakta bahwa saya telah menyeret kelas dari Finder ke proyek saya di Xcode.
Solusinya adalah pergi tab Bangun Fase dan kemudian Kompilasi Sumber dan pastikan Anda menyeret kelas ke daftar.
sumber
Saya memiliki masalah yang sama dan saya harus memeriksa "Build Active Architecture Only" pada masing-masing konfigurasi Proyek (Debug, Rilis dan Penempatan) dan dalam Pengaturan Bangun Target.
sumber
Build Active Architecture Only
pengaturan yang berbeda antaraPods
dan proyek saya. Pada tahap tautan, gagal.Kemungkinan penyebab lain dari kesalahan tautan "simbol tidak terdefinisi" adalah berusaha memanggil fungsi C dari file .mm. Dalam hal ini Anda harus menggunakan extern "C" {...} ketika Anda mengimpor file header.
Kesalahan linker memanggil C-Function dari Objective-C ++
sumber
Saya memiliki masalah serupa dengan itu. Nama kelas setelah _OBJC_CLASS _ $ _ sebenarnya adalah kelas saya. Alasannya adalah saya tidak mencentang "Tambahkan ke Target" ketika saya menyeret file kode sumber ke daftar navigasi.
Solusi saya adalah:
hapus kelas dari daftar navigasi dan pilih "hapus referensi saja"
seret file kode sumber lagi dan pastikan kotak centang untuk "tambahkan ke Target" dicentang. Kotak centang tepat di bawah "Salin jika perlu" dan "Buat grup".
sumber
Biasanya ada alias tanpa pengenal versi yang ditautkan ke versi saat ini, dalam hal ini libz.dylib terkait dengan libz.1.2.5.dylib. Gunakan alias dasar daripada yang versi.
sumber
Di bawah Target -> Pengaturan Bangun -> Apple compiler LLVM bahasa: pengaturan 'C ++ Language Dialect' dan 'C ++ Standard Library' ke Compiler default membantu menyelesaikannya.
sumber
Saya hanya menambahkan libz.1.2.5.dylib ke proyek saya dan itu bekerja seperti pesona.
Langkah -
sumber
Saya memiliki masalah serupa dan melihat kesalahan yang terkait dengan "std ::"
Saya mengubah Pengaturan Bangun -> Apple LVM 5.0 - Bahasa C ++ -> C ++ Perpustakaan Standar
dari libc ++ (LLVM C ++ Standard Library dengan dukungan C ++ 11) ke libstdc ++ (GNU C ++ Standard Library)
sumber
Saya memiliki masalah yang sama ketika saya menggunakan perpustakaan AdMob, saya memperbaikinya mengubah "Arsitektur" menjadi "Arsitektur standar armv7, armv7s" tanpa termasuk 64-bit.
sumber
Saya memiliki beberapa @interfaces dalam file .h dan belum menyertakan semua arahan @ implementasi yang sesuai. Pastikan semuanya seimbang.
sumber
Jika Anda memiliki bendera di
-ObjC
bawah Target Anda> Pengaturan Bangun> Bendera Tautan Lainnya dan Anda mendapatkan masalah ini, pertimbangkan untuk menghapusnya. Jika Anda sengaja menambahkannya karena Anda perlu memuat beberapa kode Obj-C dari perpustakaan statis yang biasanya tidak dimuat, yaitu, kategori Obj-C, maka Anda harus menggunakan-force_load <path>
sebagai ganti-ObjC
.<path>
harus relatif terhadap direktori proyek Xcode Anda. IE, jika struktur direktori Anda terlihat seperti ini:Maka Anda harus mengatur flag ini untuk
Other Linker Flags
:Jika Anda ingin menyertakan beberapa pustaka seperti itu, maka Anda harus memasukkan
-force_load
baris terpisah untuk masing-masing pustaka .sumber
Inilah cara saya mendapatkan masalah ini:
Saya menambahkan .h, .m dan NIB dari proyek lain dengan menyeret mereka ke navigator proyek saya. Xcode tidak menambahkannya ke Build Phases dengan benar.
Periksa jawaban saya karena saya memiliki masalah yang sama yang dapat saya pecahkan dengan melakukan beberapa langkah.
sumber
jika Anda berurusan dengan pembaruan iOS5, saya menemukan bahwa untuk mengkompilasi proyek yang ditulis ke target 4.3, saya hanya bisa mengganti nama libz.1.2.3.dynlib di Project Navigator menjadi libz.1.2.5.dynlib dan dikompilasi.
Folder iPhoneOS50SDK / usr / lib saya tidak memiliki libz.1.2.3.dynlib - tidak tahu apakah itu versi beta atau hanya peningkatan alami.
sumber
Buka proyek Anda, klik fase Bangun, Kompilasi sumber, Tambahkan GameCenterManager.m ke daftar.
sumber
Mungkin beberapa kelas hilang dari target Anda. Ini biasanya terjadi ketika Anda mengganti nama / menghapus / menambahkan file kelas baru ke proyek Anda. Untuk memperbaiki, tambahkan kelas yang baru ditambahkan ke beberapa target.
Pilih kelas di Project Navigator (sidebar kanan), buka sidebar Utilities (sidebar kanan), dari Utilities pilih Inspektur File (ikon seperti file), di bawah tab Keanggotaan Target centang target Anda. Ini semua untuk menghindari "Hapus referensi" dan tambahkan lagi dengan mencentang trik "Tambahkan ke target".
Jadi: Pilih Kelas -> Utilitas (Pemeriksa File) -> Keanggotaan Target -> Centang target yang Anda inginkan.
sumber
Saya tidak menemukan saran ini di sini, jadi begini: jika proyek Anda memiliki lebih dari satu target (yaitu satu untuk OSX dan satu untuk iOS) maka Anda harus menautkan perpustakaan yang relevan untuk setiap target .. jadi misalnya dalam kasus saya, saya diperlukan AudioToolbox .. Saya harus menambahkannya sekali untuk OSX dan sekali untuk iOS (di bawah folder frameworks , Anda harus memiliki duplikat dari setiap perpustakaan untuk setiap target .. jika Anda hanya melihat satu .. maka itu adalah bendera merah)
sumber
Saya menghadapi masalah dengan perpustakaan PJSIP,
Mencoba yang berikut ini di flag-flag linker lain dalam proyek dan mampu menyelesaikan kesalahan: -Framework Foundation -framework UIKit
Bendera tautan di atas digunakan dalam Proyek Siphone di atas github . Pengaturan ini akan membantu Anda menyelesaikan masalah yang terkait dengan menautkan pustaka C ++.
sumber
Akhirnya saya sudah menemukan jawabannya, saya memecahkan masalah ini dengan menambahkan kerangka kerja yang tidak ada pada target-> Build Phases-> Link Binary With Libraries
sumber
Saya pernah punya masalah ini. Saya menyadari bahwa saat memindahkan kelas, saya telah menimpa
.mm
file dengan.h
file pada folder tujuan.Memperbaiki masalah itu memperbaiki kesalahan.
sumber
Saya menerima kesalahan 'Simbol yang tidak terdefinisi untuk arsitektur armv7:' ketika mencoba mengkompilasi proyek yang memiliki pengaturan target bangunan untuk 'C ++ Perpustakaan Standar' diatur ke 'libc ++' (diperlukan karena proyek menggunakan beberapa fitur dari C ++ 11), dan proyek termasuk sub-proyek yang memiliki pengaturan yang sama diatur ke 'libstdc ++' (atau kompiler default seperti saat ini).
Mengubah pengaturan 'C ++ Standard Library' sub-proyek ke libc ++ memperbaikinya, tetapi hanya setelah terlebih dahulu menetapkan target penyebaran untuk sub-proyek ke 5.0 atau lebih tinggi (5.0 diperlukan untuk libc ++).
sumber
Saya memberi Anda lebih banyak saran yang dapat Anda periksa ketika saran umum lainnya tidak membantu.
Jika Anda terhubung dengan proyek lain (libxxx.a) Anda kadang-kadang mungkin menemui masalah aneh yang Anda dapat menemukan simbol dengan alat-alat seperti nm tetapi mereka tidak dapat menemukan simbol di ld. Maka Anda harus memeriksa apakah kedua proyek dibangun dalam flag yang sama, beberapa di antaranya mungkin memengaruhi format biner.
sumber
Saya mendapat masalah ini ketika saya menjalankan aplikasi di iphone5s , itu diselesaikan dengan menambahkan arm64 ke Arsitektur .
sumber
Saya memiliki masalah yang sama. Saya mencoba segala sesuatu dari daftar jawaban yang besar tetapi pada akhirnya masalah saya adalah: Saya bekerja dengan openCV jadi saya harus menggabungkan kode C ++ dalam kode saya. Untuk melakukan ini, Anda harus mengubah file yang menggunakan objektif-c dan C ++ ke .mm Saya tidak mengubah satu file dan file ini tidak memiliki koneksi ke kode C ++ tetapi saya harus mengubahnya.
sumber
Saya punya masalah ini, ketika menginstal shareKit. Itu bekerja di simulator, tetapi tidak pada perangkat. Saya menghapus -all_load dari Other Linker Flag dan semuanya berfungsi dengan baik di perangkat simulator dan iphone.
sumber
Dalam kasus saya, saya telah menambahkan kerangka kerja yang harus menggunakan Objective C ++. Saya menemukan posting ini:
XCode .m vs. .mm
yang menjelaskan bagaimana main.m perlu diganti nama menjadi main.mm sehingga kelas Objective-C ++ dapat dikompilasi juga.
Itu memperbaikinya bagi saya.
sumber
Saya menggunakan untuk menghadapi masalah itu ketika modul (file .m) tidak dalam target yang saya bekerja dengan
sumber
Bagi saya masalahnya adalah bahwa saya lupa menetapkan nilai untuk konstanta saya di .m (implementasi)
sumber
Saya juga menambahkan file melalui Seret dan Jatuhkan. Apa yang saya lakukan, saya menghapus referensi semua file (Tidak Termasuk
frameworks
) kemudian menambahkannya dengan benar melalui opsi Tambah File Ke Proyek , masalah hilang.sumber
Jika Anda membangun dari Unity3D 5 dan juga menggunakan plugin Prime31 dan Anda mendapatkan kesalahan ini mungkin karena duplikat .dll. Jika Anda melihat peringatan Anda di editor Unity, salah satunya akan memberi tahu Anda dan memperingatkan bahwa ini bisa menyebabkan kesalahan pembangunan. Untuk melihat apakah ini masalahnya, ketik P31 di bidang pencarian proyek Anda dan itu akan muncul, bahkan mungkin lebih dari satu. Duplikat akan memiliki '1' di akhir nama file. Ini mungkin disebabkan karena memperbarui plugin di editor melalui toko atau tab menu Prime31.
sumber