Simbol yang tidak terdefinisi untuk armv7 arsitektur

307

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.dylibdan itu tidak membantu, ada yang punya ide?

Alex Trott
sumber
Kemungkinan lain yang tidak tercakup dalam salah satu jawaban yang ada adalah bahwa Anda mungkin menggunakan -ObjCbendera 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/901641
ArtOfWarfare
2
Sebagai aturan praktis, kadang-kadang XCode memberikan jenis kesalahan seperti Match-O dan simbol yang tidak ditemukan untuk arsitektur i386 (atau lainnya) ketika file tidak ditambahkan ke proyek. Anda dapat mengklik kanan pada folder proyek dan melakukan "Tambahkan file ke <project>".
Fabricio PH
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 diurai dengan ini: nm -gC file.o
james_alvarez
Bisakah seseorang di sini tolong bantu saya? Saya mendapatkan kesalahan di bawah ini tetapi tidak ada solusi di atas yang berfungsi untuk saya. Saya sudah menghabiskan berhari-hari dengan semua pengaturan yang memungkinkan. Undefined 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)
iblis merah

Jawaban:

506

Penyebab umum

Penyebab umum untuk "Simbol yang tidak terdefinisi untuk arsitektur armv7" adalah:

  1. 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 Librariesbagian Build Phases.

    • Jika Anda ingin menambahkan pustaka di luar jalur pencarian default, Anda dapat memasukkan path dalam Library Search Pathsnilai dalam Build Settings dan menambahkan
      -l{library_name_without_lib_and_suffix}(mis. Untuk penggunaan libz.a -lz) ke Other Linker Flagsbagian Build Settings.

  2. Anda menyalin file ke proyek Anda tetapi lupa memeriksa target untuk menambahkan file . Untuk menyelesaikan:

    • Buka Build Phasesuntuk target yang benar, perluas Compile Sourcesdan tambahkan .mfile yang hilang . Jika ini adalah masalah Anda, harap berikan jawaban Cortex di bawah ini juga.

  3. 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

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Saya sarankan menghapus referensi dan kemudian menambahkannya kembali di bagian Binary With Libraries Bangun Fase dari target Anda.

Joe
sumber
4
Mungkin juga karena Anda perlu menambahkan kata "-licucore" di pengaturan proyek / Flags Linker Lainnya. Itu ditambahkan secara otomatis untuk build debug saya tetapi bukan rilisnya jadi tidak akan dikompilasi.
JulianB
4
Saya memiliki masalah yang sama. Tidak benar-benar membaca catatan instalasi dengan benar sehingga tidak memperhatikan bahwa versi baru bugense memerlukan libz binary yang ditambahkan dalam fase build.
Max MacLeod
2
Apakah Anda yakin bahwa Anda telah memasukkan bagian @implementation dalam file .m Anda masing-masing untuk semua kelas yang telah Anda nyatakan dalam file header Anda?
slcott
7
Saya hanya ingin menambahkan. Saya pikir Anda sangat menghargai referensi jawaban lain untuk pertanyaan ini dan meminta kami untuk memberikan suara jika itu membantu.
Andrew
Terimakasih atas bantuannya! :) Bagi saya membantu mengetik secara eksplisit dalam Lain bagian Flags Linker: -framework <FrameWorkName>. Saya punya masalah dengan XCTest, jadi saya harus menambahkan -framework XCTest. Terima kasih! :)
piotr_ch
198

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.

Cortex
sumber
6
Saya berharap saya menyadari ini adalah jawaban yang saya cari sebelumnya- Atau Anda dapat memastikan untuk memeriksa 'Tambahkan ke target' saat menyalin kelas.
T. Markle
1
Whoa ... senang sekali perbaikannya semudah ini! Untuk lebih jelasnya, jika Anda menambahkan kelas dengan menyeret dari finder ke proyek Anda, XCode tampaknya tidak selalu menambahkannya ke daftar fase pembuatan Anda. Saya baru saja menekan tombol "+" di "Sumber Kompilasi" di bawah fase build, menambahkan semua file yang menyinggung, dan langsung dikompilasi.
Amos
1
Wow. Apple benar-benar perlu mempertimbangkan kembali pesan kesalahan mereka.
devios1
2
Cara lain untuk memperbaiki ini adalah pilih file yang dikatakan hilang. dan buka bilah geser "Utilities". (Itu yang paling kanan) Dan pilih "File Inspector". Kemudian pastikan ada cek di proyek di bawah "Target Keanggotaan". Saya menggunakan Xcode 4.6.2
zingle-dingle
1
Saya tidak tahu file mana yang hilang, jadi saya menunjukkan Build Phases di asisten editor (tampilan pengeditan kedua). Saya membuka file yang menyinggung di tampilan pengeditan kiri dan memeriksa bahwa setiap file yang diimpor ada di Build Phases. Saya menambahkan satu yang tidak dan itu diselesaikan.
Dan Sandland
38

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.

Alex Zavatone
sumber
3
Juga melakukan trik untuk saya. Hanya dibutuhkan di proyek utama sekalipun.
Kirualex
4
Saya menghadapi masalah yang sama. The Build Active Architecture Onlypengaturan yang berbeda antara Podsdan proyek saya. Pada tahap tautan, gagal.
AechoLiu
21

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 ++

pengguna2166865
sumber
14

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:

  1. hapus kelas dari daftar navigasi dan pilih "hapus referensi saja"

  2. 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".

Syoleen
sumber
Hanya untuk menambahkan: walaupun ini BUKANLAH PENYEBAB YANG PALING UMUM dari kesalahan, saya hanya jawaban Anda (tidak mencentang kotak) terjadi pada saya sekarang.
Adam
8

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.

zaph
sumber
5

Di bawah Target -> Pengaturan Bangun -> Apple compiler LLVM bahasa: pengaturan 'C ++ Language Dialect' dan 'C ++ Standard Library' ke Compiler default membantu menyelesaikannya.

pengguna1368045
sumber
5

Saya hanya menambahkan libz.1.2.5.dylib ke proyek saya dan itu bekerja seperti pesona.

Langkah -

  1. Pergi ke Build Phases.
  2. Tautan Biner Dengan Pustaka - gunakan tombol '+' untuk memilih kerangka kerja dan pustaka yang akan ditambahkan.
  3. Pilih libz.1.2.5.dylib dari daftar.
  4. Bangun dan jalankan.
girish_vr
sumber
5

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)

Andrew Soltan
sumber
5

Saya memiliki masalah yang sama ketika saya menggunakan perpustakaan AdMob, saya memperbaikinya mengubah "Arsitektur" menjadi "Arsitektur standar armv7, armv7s" tanpa termasuk 64-bit. Pengaturan Bangun

pabloverd
sumber
4

Saya memiliki beberapa @interfaces dalam file .h dan belum menyertakan semua arahan @ implementasi yang sesuai. Pastikan semuanya seimbang.

James
sumber
4

Jika Anda memiliki bendera di -ObjCbawah 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:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Maka Anda harus mengatur flag ini untuk Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Jika Anda ingin menyertakan beberapa pustaka seperti itu, maka Anda harus memasukkan -force_loadbaris terpisah untuk masing-masing pustaka .

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another
ArtOfWarfare
sumber
4

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.

Himanshu Agnihotri
sumber
3

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.

Stan
sumber
3

Buka proyek Anda, klik fase Bangun, Kompilasi sumber, Tambahkan GameCenterManager.m ke daftar.

Dhaval Sarvaiya
sumber
3

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.

andrei
sumber
2

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)

abbood
sumber
Jawaban ini membantu saya. Namun, situasi saya bahkan lebih lurus ke depan ... Saya hanya lupa untuk menambahkan kerangka kerja yang dirujuk oleh basis kode saya. Dalam kasus saya, saya gagal memuat AVFoundation.framework.
John Erck
Yap, saya lupa menambahkan kerangka kerja di bawah fase "Link Binary with Libraries".
Maks
2

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 ++.

Adeesh Jain
sumber
Saya mengalami masalah yang sama dengan perpustakaan PJSIP, dapatkah Anda menjelaskan solusinya secara rinci
Rajat Jain
Tetapkan nilai-nilai berikut di flag linker lain dari pengaturan pembangunan proyek: -Framework Foundation -framework UIKit
Adeesh Jain
Pesan Galat: mengabaikan file / Pengguna / pengguna / Unduhan / projek-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, file dibuat untuk arsip yang bukan arsitektur yang ditautkan (i386): / Pengguna /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Simbol yang tidak terdefinisi untuk arsitektur i386: "_pjsip_register_method", dirujuk dari:
Rajat Jain
Sepertinya Anda mencoba menjalankan aplikasi pada simulator dan libyuv.a tidak dibuat untuk arsitektur simulator i386. coba jalankan aplikasi di perangkat secara langsung
Adeesh Jain
Saya ingin mengintegrasikan Pjsip di Swift. Saya mencoba membuat header penghubung tetapi tidak berhasil. Bisakah Anda memberi saya ide?
Rajat Jain
1

Akhirnya saya sudah menemukan jawabannya, saya memecahkan masalah ini dengan menambahkan kerangka kerja yang tidak ada pada target-> Build Phases-> Link Binary With Libraries

lomec
sumber
1

Saya pernah punya masalah ini. Saya menyadari bahwa saat memindahkan kelas, saya telah menimpa .mmfile dengan .hfile pada folder tujuan.

Memperbaiki masalah itu memperbaiki kesalahan.

pengguna2158690
sumber
1

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 ++).

Si.
sumber
1

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.

  1. periksa c ++ compiler.
  2. periksa c ++ pengaturan dialek.
  3. periksa c ++ jenis dukungan runtime. (-frtti / -fnortti)
  4. periksa apakah ada .a dengan nama yang sama muncul di tempat lain, bisa di luar file yang diinginkan dalam daftar jalur tautan. Hapus mereka.
kebetulan
sumber
1

Saya mendapat masalah ini ketika saya menjalankan aplikasi di iphone5s , itu diselesaikan dengan menambahkan arm64 ke Arsitektur .

alexqinbj
sumber
1

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.

pengguna2743760
sumber
1

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.

Yordania
sumber
1

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.

Vito Andolini
sumber
1

Saya menggunakan untuk menghadapi masalah itu ketika modul (file .m) tidak dalam target yang saya bekerja dengan

Javier Calatrava Llavería
sumber
1

Bagi saya masalahnya adalah bahwa saya lupa menetapkan nilai untuk konstanta saya di .m (implementasi)

file const kFooKey = @"Foo";
Jakub Truhlář
sumber
1

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.

Vaibhav Saran
sumber
1

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.

Dela Torre
sumber