Mimari armv7 için tanımlanmamış semboller


307

Bu sorun beni deli ediyor ve nasıl düzeltebileceğimi bilemiyorum ...

    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

Bence bununla ilgisi var:

ld: symbol(s) not found for architecture armv7

Ama ekledim: libz.1.2.3.dylibve bu yardımcı olmuyor, kimsenin fikri yok mu?


Mevcut yanıtların herhangi birinde ele alınmayan bir diğer olasılık, -ObjCdiğer bağlayıcı bayrağı kullanıyor olmanızdır ve böylece kullandığınız harici statik kitaplıklardan (Parse gibi) görünmemesi gereken Obj-C görünür olabilir. Bu durumda cevabımı görün: stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
Başparmak kuralı olarak, bazen XCode, projeye dosyalar eklenmediğinde Match-O ve i386 mimarisi (veya diğer) için bulunmayan sembol gibi tür hatalar verir. Proje klasörünü sağ tıklatıp "Dosyayı <project> dosyasına ekle" yi yapabilirsiniz.
Fabricio PH

Aslında nm aracı kullanılarak oluşturulan somut sembolleri görebilirsiniz. Terminali .o dosyalarının yoluna yönlendirin nm -gve sembolü çağıran ve sembolü olması gereken dosyada çalıştırın ve bunların eşleşip eşleşmediğini görmelisiniz, bu da hata için ipuçları sağlayabilir. nm -g file.o Şununla demonte edilmiş C ++ sembollerini inceleyebilirsiniz: nm -gC file.o
james_alvarez 8:16

Buradaki biri bana yardım edebilir mi? Aşağıdaki hatayı alıyorum ama yukarıdaki çözümlerin hiçbiri benim için çalışmıyor. Zaten mümkün olan tüm ayarlarla günler geçirdim. 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)
kırmızı şeytan

Yanıtlar:


506

Yaygın sebepler

"Armv7 mimarisi için tanımlanmamış semboller" in genel nedenleri:

  1. Sen bir başlık içe ve doğru kütüphaneye karşı bağlamak yok . Bu, özellikle projelere varsayılan olarak dahil edilmediğinden, özellikle QuartzCore gibi kütüphanelerin başlıkları için yaygındır. Çözmek için:

    • Link Binary With LibrariesBölümünde doğru kitaplıkları ekleyin Build Phases.

    • Varsayılan arama yolunun dışında bir kitaplık eklemek istiyorsanız, yolu Library Search PathsYapı Ayarları'na değere dahil edebilir ve bölümüne
      -l{library_name_without_lib_and_suffix}(örneğin libz.a use için -lz) ekleyebilirsiniz .Other Linker FlagsBuild Settings

  2. Sen projenize dosya kopyalamak ancak dosya eklemek için hedef bakmayı unuttum . Çözmek için:

    • Build PhasesDoğru hedef için öğesini açın, Compile Sourceseksik .mdosyaları genişletin ve ekleyin . Sorununuz buysa, lütfen Cortex'in cevabını da aşağıdan kaldırın .

  3. Sen başka mimarisi için inşa edilmiştir statik bir kütüphane yer i386, sizin ana makinede simülatörü gibi. Çözmek için:

    • Projeye dahil etmek için kütüphaneler satıcınızdan birden fazla kütüphane dosyanız varsa, simülatör için (i386) ve cihaz için olanı (örneğin armv7) eklemeniz gerekir.

    • İsteğe bağlı olarak, her iki mimariyi de içeren bir yağ statik kitaplığı oluşturabilirsiniz.



Orijinal Yanıt:

Doğru libz dosyasına bağlanmadınız. Dosyayı sağ tıklatıp bulucuda gösterirseniz, yolu bir iOS sdk klasöründe olmalıdır. İşte benim

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

Başvuruyu kaldırmanızı ve ardından yeniden İkili Kitaplıklarıyla Bağla bölümünde Hedefinizin Aşamaları Oluşturma bölümüne yeniden eklemenizi öneririm.


4
Bunun nedeni, proje ayarlarında / Diğer Bağlayıcı Bayraklarında "-licucore" sözcüğünü eklemeniz de olabilir. Hata ayıklama derlemem için otomatik olarak eklendi, ancak sürüm değil, bu yüzden derlenmedi.
JulianB

4
Aynı sorunu yaşadım. Yükleme notlarını düzgün bir şekilde okumadım, bu yüzden bugsense'in yeni sürümünün derleme aşamalarında eklenen libz ikili dosyasına ihtiyacı olduğunu fark etmemiştim.
Max MacLeod

2
Başlık dosyanızda bildirdiğiniz tüm sınıflar için ilgili .m dosyanıza bir @ uygulama bölümü eklediğinizden emin misiniz?
slcott

7
Sadece eklemek istiyorum ki, bu soruya başka bir cevap göndermeniz ve bu yardımcı olursa oy vermemizi söylemeniz gerçekten saygılıydı.
Andrew

Yardım için teşekkürler! :) Beni Diğer Bağlayıcı Bayrakları bölümünde açıkça yazarak yardım için: -framework <FrameWorkName>. XCTest ile sorunum vardı, bu yüzden eklemek zorunda kaldım -framework XCTest. Teşekkürler! :)
piotr_ch

198

Dün gece benzer bir sorun yaşadım ve sorun, Finder'dan Xcode'daki projeme bir sınıf sürüklediğim ile ilgiliydi.

Çözüm, Derleme Aşamaları sekmesine ve ardından Kaynakları Derle'ye gidip sınıfı listeye sürüklediğinizden emin olmaktı.


6
Keşke bunun daha önce aradığım cevap olduğunu fark etseydim- Alternatif olarak sınıfları kopyalarken 'Hedeflere ekle'yi kontrol ettiğinizden emin olabilirsiniz.
T. Markle

1
Vay be ... düzeltme bu kadar kolay oldu sevindim! Açık olmak gerekirse, bulucudan projenize sürükleyerek bir sınıf eklerseniz, XCode her zaman görünüşte derleme aşamaları listenize eklemez. Sadece derleme aşamaları altında "Derleme Kaynakları", "+" düğmesine basın, tüm rahatsız dosyaları ekledi ve hemen derledi.
Amos

1
Vay. Apple'ın hata mesajlarını gerçekten yeniden düşünmesi gerekiyor.
devios1 15.03.2013

2
Bunu düzeltmenin başka bir yolu, eksik olduğu söylenen seçme dosyasıdır. ve "Yardımcı Programlar" kaydırma çubuğunu açın. (Bu en doğru olanı) Ve "Dosya Denetçisi" ni seçin. Sonra "Hedef Üyelik" altında projede bir kontrol olduğundan emin olun. Xcode 4.6.2 kullanıyorum
zingle-dingle

1
Hangi dosyanın eksik olduğunu bilmiyordum, bu yüzden yardımcı editörde Derleme Aşamalarını gösterdim (ikinci düzenleme görünümü). Sorunlu dosyayı sol düzenleme görünümünde açtım ve içe aktarılan dosyaların her birinin Derleme Aşamalarında bulunduğunu kontrol ettim. Bunu yapmayanı ekledim ve çözüldü.
Dan Sandland

38

Benzer bir sorunum vardı ve her bir Proje yapılandırmasında (Hata Ayıklama, Serbest Bırakma ve Dağıtım) ve Hedef Oluşturma Ayarlarında "Yalnızca Etkin Mimari Oluştur" seçeneğini işaretlemem gerekiyordu.


3
Benim için de hile yaptı. Sadece ana projede ihtiyaç vardı.
Kirualex

4
Aynı sorunlarla karşılaşıyorum. Build Active Architecture OnlyAyarlar arasında farklıdır Podsve benim proje. Bağlantı aşamasında başarısız oldu.
AechoLiu


14

Bununla benzer bir sorunum vardı. _OBJC_CLASS _ $ _ 'den sonraki sınıf adı aslında benim sınıfımdı. Bunun nedeni, kaynak kod dosyalarını navigasyon listesine sürüklediğimde "Hedefe Ekle" yi işaretlemememdi.

Benim çözümüm şuydu:

  1. navigasyon listesinden sınıfı silin ve "yalnızca referansı kaldır" ı seçin

  2. kaynak kod dosyalarını tekrar sürükleyin ve "Hedefe ekle" onay kutusunun işaretli olduğundan emin olun. Onay kutusu "Gerekirse kopyala" ve "Grup oluştur" un hemen altındadır.


Sadece eklemek için: Her ne kadar bu hatanın en yaygın nedeni olmasa da, sadece cevabınız (kutuyu işaretlemedim) şimdi başıma geldi.
Adam

8

Genellikle sürüm tanımlayıcısı olmayan ve geçerli sürüme bağlı bir takma ad vardır, bu durumda libz.dylib libz.1.2.5.dylib'e bağlanır. Sürümlü olan yerine temel diğer adı kullanın.


5

Hedef -> Derleme Ayarları -> Apple LLVM derleyici dili altında: 'C ++ Dil Lehçesi' ve 'C ++ Standart Kütüphane' nin Derleyici varsayılanına ayarlanması bu sorunun çözülmesine yardımcı oldu.


5

Sadece libz.1.2.5.dylib'i projeme ekledim ve bir cazibe gibi çalıştı.

Adımlar -

  1. Yapı Aşamaları'na gidin.
  2. İkili Bağlantı Kütüphaneyle - eklenecek çerçeveleri ve kütüphaneleri seçmek için '+' düğmesini kullanın.
  3. Listeden libz.1.2.5.dylib dosyasını seçin.
  4. Oluşturun ve çalıştırın.

5

Benzer bir sorun vardı ve "std ::" ile ilgili hatalar gördüm

Oluşturma Ayarları'nı değiştirdim -> Apple LVM 5.0 - Dil C ++ -> C ++ Standart Kütüphane

libc ++ (C ++ 11 destekli LLVM C ++ Standart Kitaplığı) libstdc ++ (GNU C ++ Standart Kitaplığı)


5

Admob kütüphanesini kullandığımda da aynı problemi yaşadım, "Mimarileri" 64 bit eklemeden "Standart mimarlar armv7, armv7s" olarak değiştirerek düzelttim. Derleme Ayarları


4

.H dosyasında birden fazla @ arabirim var ve karşılık gelen @ uygulama yönergelerinin tümünü henüz eklememiştim. Hepsinin dengeli olduğundan emin olun.


4

-ObjCHedef> Oluşturma Ayarları> Diğer Bağlayıcı Bayrakları altında bayrak varsa ve bu sorunu alıyorsanız, kaldırmayı düşünün. Normalde aksi halde yüklenmeyecek statik bir kütüphaneden bazı Obj-C kodları yüklemeniz gerektiğinden, bir Obj-C kategorisi olan IE'yi yüklemeniz gerektiğinde eklemişseniz, -force_load <path>bunun yerine kullanmalısınız -ObjC.

<path>Xcode proje dizininize göreli olmalıdır. IE, dizin yapınız şöyle görünüyorsa:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

O zaman şu bayrağı ayarlamanız gerekir Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Bunun gibi birden fazla kitaplık eklemek istiyorsanız, -force_loadher biri için ayrı bir satır eklemeniz gerekir.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

İşte bu sorunu nasıl var:

Başka bir projeden .h, .m ve NIB'yi proje gezginime sürükleyerek ekledim. Xcode, bunları Derleme Aşamalarına düzgün bir şekilde eklemedi.

Cevabımı kontrol et çünkü bazı adımlar yaparak çözebildiğim benzer bir sorunum vardı.


3

iOS5 yükseltmesi ile uğraşıyorsanız, hedef 4.3'e yazılan bir projeyi derlemek için Proje Gezgini'nde libz.1.2.3.dynlib'i libz.1.2.5.dynlib olarak yeniden adlandırabileceğimi ve derlediğini buldum.

İPhoneOS50SDK / usr / lib klasörümün libz.1.2.3.dynlib dosyası yok - bunun beta bir şey mi yoksa sadece doğal bir yükseltme mi olduğunu bilmiyorum.


3

Projenize gidin, Fazlar oluştur, Kaynakları derleyin, listeye GameCenterManager.m ekle üzerine tıklayın.


3

Muhtemelen bazı sınıflar hedefinizde eksik. Bu genellikle projenize yeni sınıf dosyalarını yeniden adlandırdığınızda / kaldırdığınızda / eklediğinizde olur. Düzeltmek için yeni eklenen sınıfları bazı hedeflere ekleyin.

Proje Gezgini'nde (sağ kenar çubuğu) sınıfı seçin, Yardımcı Programlar kenar çubuğunu (sağ kenar çubuğu) açın, Yardımcı Programlar'dan Dosya Denetçisi'ni (dosya benzeri simge) seçin, Hedef Üyelik sekmesinin altında hedeflerinizi işaretleyin. Tüm bu "Referansı kaldır" önlemek ve "Hedeflere ekle" hile işaretleyerek tekrar ekleyin.

Yani: Seç Sınıf -> Utilities (Dosya Müfettiş) -> Hedef Üyelik -> Kene istediğiniz hedefler.


2

Bu öneriyi burada bulamadım, işte burada: eğer projeniz birden fazla hedefe sahipse (yani OSX için bir ve iOS için bir tane), o zaman her hedef için ilgili kütüphaneleri bağlamanız gerekir .. yani benim durumumda gerekli AudioToolbox .. OSX için bir kez ve iOS için bir kez eklemek zorunda kaldım ( çerçeveler klasörü altında, her hedef için her kütüphanenin bir kopyası olmalıdır .. sadece bir tane görürseniz .. o zaman bu bir kırmızı bayrak)


Bu cevap bana yardımcı oldu. Ancak, benim durumum daha düz ileri oldu ... Ben sadece benim kod tabanı referans bir çerçeve eklemeyi unuttum. Benim durumumda AVFoundation.framework dosyasını yükleyemedim.
John Erck

Evet, "İkili Kütüphanelere Bağla" aşamasına bir çerçeve eklemeyi unuttum.
Max

2

PJSIP kütüphanelerinde bir sorunla karşılaşıyordum,

Projedeki diğer bağlayıcı bayraklarında aşağıdakileri denedim ve hatayı çözebildik: -framework Foundation -framework UIKit

Yukarıdaki bağlayıcı bayraklar sifon projesinde github üzerinden kullanılır . Bu ayarlar, C ++ kitaplıklarının bağlanmasıyla ilgili sorunları çözmenize yardımcı olacaktır.


PJSIP kütüphanecileri ile aynı problemi yaşıyorum, Çözümü ayrıntılı olarak açıklayabilir misiniz
Rajat Jain

Proje oluşturma ayarının diğer bağlayıcı bayraklarında aşağıdaki değerleri ayarlayın: -framework Foundation -framework UIKit
Adeesh Jain

Hata İletisi: /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a dosyası yoksayılıyor, dosya bağlı olmayan mimari olmayan arşiv için oluşturuldu (i386): / Kullanıcılar /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a i386 mimarisi için tanımlanmamış semboller: "_pjsip_register_method", referans:
Rajat Jain

Görünüşe göre simülatörde uygulamayı çalıştırmaya çalışıyorsunuz ve libyuv.a simülatör mimarisi i386 için tasarlanmamıştır. uygulamayı doğrudan cihazda çalıştırmayı deneyin
Adeesh Jain

Pjsip'i Swift'e entegre etmek istiyorum. Köprü üstbilgileri oluşturmayı denedim ama işe yaramadı. Bana bir fikir verebilir misin?
Rajat Jain

1

Sonunda anladım, hedef -> Yapı Aşamaları -> İkili Kitaplıklarıyla Bağlantı için çerçeve ekleyerek bu sorunu çözdüm


1

Bir zamanlar bu problemi yaşadım. Bir sınıfı taşırken .mmdosyanın üzerine yazdığımı fark ettim..h hedef klasöre dosyanın.

Bu sorunu düzeltmek hatayı düzeltti.


1

'C ++ Standart Kitaplığı' için hedef oluşturma ayarı 'libc ++' olarak ayarlanmış bir projeyi derlemeye çalıştığımda 'Mimari armv7 için tanımlanmamış semboller' hatası aldım (proje C ++ 11'in bazı özelliklerini kullanıyor olduğu için gerekli) ve proje, aynı ayarı 'libstdc ++' olarak ayarlanmış bir alt proje içeriyordu (veya şu anda olduğu gibi derleyici varsayılanı).

Alt projenin 'C ++ Standart Kitaplığı' ayarını libc ++ olarak değiştirmek sorunu düzeltti, ancak yalnızca ilk proje için dağıtım hedefini 5.0 veya üstüne ayarladıktan sonra (libc ++ için 5.0 gereklidir).


1

Diğer yaygın önerilerin ne zaman yardımcı olmadığını kontrol edebileceğiniz daha fazla öneri veriyorum.

Başka bir projeyle (libxxx.a) bağlantı kurarsanız, bazen sembolü nm gibi araçlarla bulabileceğiniz garip bir sorunla karşılaşabilirsiniz, ancak sembolleri ld olarak bulamazlar. Daha sonra, iki projenin aynı bayraklarda yapılıp yapılmadığını kontrol etmelisiniz, bazıları ikili formatı etkileyebilir.

  1. c ++ derleyicisini kontrol edin.
  2. c ++ lehçe ayarını kontrol edin.
  3. c ++ çalışma zamanı türü desteğini kontrol edin. (-Frtti / -fnortti)
  4. başka bir yerde aynı ada sahip .a olup olmadığını kontrol edin, bağlantı yolu listesinde istenen dosyanın ötesinde olabilir. onları kaldır.

1

Ben Uygulamayı çalıştırdığınızda bu sorun var iphone5s o eklenti ile çözüldü, arm64 için Mimarlar .


1

Ben de aynı problemi yaşadım. Cevabım büyük listeden her şeyi denedim ama sonunda benim sorunum oldu: Ben kodumu C ++ kodu birleştirmek gerekir bu yüzden openCV ile çalışıyorum. Bunu yapmak için objektif-c ve C ++ .mm için dosyaları değiştirmek gerekir. Ben bir dosyayı değiştirmedim ve bu dosya C ++ kodu ile bağlantısı yok ama değiştirmek zorunda kaldı.


1

ShareKit'i yüklerken bu sorunu yaşadım. Simülatörde çalıştı, ancak cihazda çalışmadı. -All_load'u Diğer Bağlayıcı Bayrağından kaldırdım ve her şey hem simülatör hem de iphone cihazında iyi çalışıyor.


1

Benim durumumda, Objective C ++ kullanması gereken bir çerçeve ekledim. Bu yazıyı buldum:

XCode .m ve .mm

Bu, Objective-C ++ sınıflarının da derlenebilmesi için main.m'nin main.mm olarak nasıl yeniden adlandırılması gerektiğini açıkladı.

Bu benim için sorunumu çözdü.



1

Benim için sorun, sabitlerim için .m (uygulama) değer ayarlamayı unutmak oldu

file const kFooKey = @"Foo";

1

Ayrıca Sürükle ve Bırak ile de dosya ekledim. Yaptığım, tüm dosyaların referanslarını (Hariç frameworks) kaldırdım ve sonra Projeye Dosya Ekle seçeneği ile tekrar düzgün bir şekilde ekledim , sorun gitti.


1

Unity3D 5'ten inşa ediyorsanız ve ayrıca bir Prime31 eklentisi kullanıyorsanız ve bu hatayı alıyorsanız, bunun nedeni büyük olasılıkla yinelenen bir .dll dosyasıdır. Unity'nin editöründeki uyarılarınıza bakarsanız, bunlardan biri size bunu söyleyecek ve derleme hatalarına neden olabileceği konusunda uyaracaktır. Durumun böyle olup olmadığını görmek için proje arama alanınıza P31 yazın ve hemen açılmalıdır, belki birden fazla. Yinelenen dosya adının sonunda bir '1' olacaktır. Bunun nedeni büyük olasılıkla mağazadaki veya Prime31 menü sekmesi aracılığıyla editördeki eklentinin güncellenmesidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.