Xcode derleme hatası “x86_64 mimarisi için tanımlanmamış semboller”


168

Bir Xcode acemi sorusu:

Xcode 4.6.3 ile ilk deneyimim.

Eşleştirilmiş BT cihazlarını arayan ve bir NSLog'a yazdıran çok basit bir konsol programı yazmaya çalışıyorum.

Aşağıdaki hatayla oluşturulur:

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)

Deli gibi aradım. Sık karşılaşılan sorun, yalnızca başlık dosyalarının içe aktarıldığı ve bağlayıcı tarafından hiçbir uygulama (* .m dosyası) bulunmayan bir dosyaya başvuru olmalıdır. Ancak IOBluetooth kütüphanesi, Foundation Framework gibi standart bir Framework'tür.

Yukarıdaki açıklamamda ne eksik?

Ayrıca 32-bit bir makine için inşa denedim (yapı tekrar başarısız). Açıkça bir linker hatası, ancak ne ile ilgili hiçbir fikrim yok, sadece x86 ve x64 mimarisinde, IOBluetoothDevice için uygulama bulmakla ilgili bir sorun olması dışında, üstbilgi dosyaları adı verilen standart bir Çerçeve, IOBluetooth?

Bilginiz için benim ana kod "main.m" olmak:

#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;
}

Herhangi bir yardım veya doğru yönü işaret ettiğiniz için teşekkür ederiz.


17
Eklemeyi deneyin $(inherited)için diğer Bağlayıcı Flags , temiz ve yapı.
Resty

1
Bu içine koştu zaman ben m dosya için Dosya Müfettiş gitmek ve kullanmaya çalıştığım modüle ihracat (?) Hedef Üyelik altındaki kutuyu işaretlemek zorunda bulundu.
Landon Kuhn

Yanıtlar:


123

Projenize IOBluetooth.framework dahil eksik gibi görünüyor. Şunlarla ekleyebilirsiniz:

Sol bölmenin sol üst köşesinde projenize tıklayın (mavi simge).

-Orta bölmede, Aşama Oluştur sekmesine tıklayın.

-"Kütüphaneler ile İkili Bağlantı" altında, artı düğmesine tıklayın.

Listeden IOBluetooth.framework bulun ve Ekle tuşuna basın.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Bu, IOBluetooth.framework tanımlarının bağlayıcı tarafından bulunmasını sağlayacaktır. Sol bölmedeki çerçeveye tıklayarak ve çerçevenin sağ bölmedeki hedef üyeliğini görerek çerçevenin hedefinizin bir üyesi olduğunu görebilirsiniz (çerçeveyi kuruluş amaçları için Çerçeveler grubunun altına taşıdığımı unutmayın):

resim açıklamasını buraya girin


3
İşe yaradı! Bazı ekran görüntüleri almak için çaba harcadığınız için de çok teşekkürler!
RisingSun

Aynı şey oAuthIOS çerçevesi için de geçerlidir. Pod klasöründen oluşturmaya çalıştığınız kök projeye oAuthIOS çerçevesini ekleyin
prodeveloper

1
IOBluetooth.framework arıyorum, ama orada değil: S
Menno van der Krift

Bu çok garip, orada olmalı.
Chris Livdahl

Müthiş! Beni saatlerce kurtardı!
Bravo Kevin

49

UPD

Elma gerektirir kullanmak arm64 mimari. Projenizde x32 kitaplıkları kullanma

Yani aşağıdaki cevap artık doğru değil!


Eski cevap

Yeni Xcode 5.1, mimari armv7, armv7s ve arm64'ü varsayılan olarak ayarlar .

Ve bazen "yapı hatası" x86_64 mimarisi için tanımlanmamış semboller "hatası bundan kaynaklanabilir. Çünkü, bazı kütüphaneler (Apple değil) orijinal olarak x32 için derlendi ve x64'ü desteklemiyor.

Yani ihtiyacınız olan şey, proje hedefiniz için "Mimarileri" değiştirmek gibi

NB. Cocoapods kullanıyorsanız "Pods" hedefi için de aynısını yapmalısınız.

resim açıklamasını buraya girin


3
Temelde arm64 şey Valid Architectures mülkiyet kaldırıldı. Daha sonra yukarıda gösterildiği gibi, sadece sanırım geçerli mimarilerde ne olduğuna bakmak zorunda kalacak!
Randika Vishman

@Vishman, merhaba! Ve arasındaki farkı kapsayan iyi bir SO yanıtı vardır . Valid ArchitecturesArchitectures
Aleksey Potapov

İOS

@BraveS: 64-bit aygıt için arm64 mimarisini kaldırarak çalışır mı?
Jayprakash Dubey

1
@JayprakashDubey merhaba ben benim app reddetti 64bit desteği ile yerleşik bir appstore yükledi. Arm64 eklemeye çalıştığımda bir hata derleme hatası “Mimarlık x86_64 için tanımlanmamış semboller” ile karşı karşıyayım. arm64'ü mimariden kaldırırsam. arm64'ü geçerli mimariye koydum. Uygulamam onaylandı mı ???
SP Balu Kommuri

31

X86_64 mimarisi için tanımlanmamış simgeler: "_OBJC_CLASS _ $ _ xxx", kaynakça: objc-class-ref in yyy.o

Bu genellikle "yyy" sınıfından "xxx" (bir çerçeve veya sınıf olabilir) dediğiniz anlamına gelir. Derleyici "xxx" bulunamıyor bu nedenle bu hata oluşur.

Gezinti penceresindeki proje klasörünüze sağ tıklayıp " Dosyaları" Kullanıcı Adınıza " " seçeneğine dokunarak eksik dosyaları (bu durumda "xxx") eklemeniz gerekir .

Proje dosyalarınızı Finder'da bir açılır pencere açar. Orada, eksik dosyaları görebilir ve sadece projenize ekleyebilirsiniz. " Gerekirse öğeleri kopyala " kutusunu işaretlemeyi unutmayın. İyi şanslar!!


17

Ayrıca türetilmiş veri bozulduğunda Xcode 7.2'de bu hatayı gördüm (benim durumumda bir neden kesintiye uğradı ve şüpheli kök neden oldu).

Bu nedenle, diğer çözümler (özellikle Chris ve BraveS'in daha olası olduğundan şüpheleniyorsanız) sorununuza uymuyorsa, türetilmiş verileri silmeyi deneyin (Seç: Pencere / Projeler / Türetilmiş Veriler -> Sil) ve yeniden oluşturma.

(Başkaları tarafından referans olarak eklendi - Orijinal sorunun doğru bir şekilde yanıtlandığını biliyorum).


14

Xcode 9.0b5 altında bununla karşılaşabilirsiniz, çünkü Xcode 9.0b5 içinde kaynak kodu eklediğinizde, hedef ayarlara uymaz. İçeri girip her dosyanın hedefini manuel olarak şu kelimelerle ayarlamanız gerekir:

Manuel hedef üyelik çizim ile Xcode projesi


13

Benim durumumda kütüphane değildi, bazı sınıflardı.


X86_64 mimarisi için tanımlanmamış semboller: "_OBJC_CLASS _ $ _ ClassNmae", şu kaynaktan başvurulur: objc-class-ref in SomeClassName ".

d: x86_64 mimarisi için sembol bulunamadı

clang: hata: linker komutu çıkış kodu 1 ile başarısız oldu (çağrıyı görmek için -v kullanın)

Çözüm Xcode'da çeşitli şemalarla (Production, Dev vb.) Çeşitli hedeflerim vardı. Yeni eklenen uygulamamın bir kısmı (Class.m) eksikti

Xcode-> Hedefler-> Derleme Aşamaları -> Derleme Kaynakları

Bu yüzden onları manuel olarak eklemek zorunda kaldım.

o zaman başarılı bir şekilde derleyebilir ve inşa edebilirim.


bu benim sorunumu çözdü. Dinamik bir çerçeve kullanıyordum. başka bir şey ben manuel olarak eklemek için fikir sevmiyorum olmasıdır.
toxicsun

9

Aynı problemle de karşılaştım, yukarıdaki yöntemler işe yaramayacak. Aşağıdaki dizindeki dosyaları yanlışlıkla sildim. resim açıklamasını buraya girin

Veya

~ / Library / Geliştirici / Xcode / DerivedData /

resim açıklamasını buraya girin


4
Asıl yolun / komutun ne olduğunu merak edenler için: ~/Library/Developer/Xcode/DerivedData/ CLI aracılığıyla dizini aşağıdaki gibi temizleyebilirsiniz:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus

6

Xcode 7.1 sürümüne güncellerken, bu tür bir hata görebilirsiniz ve yukarıdaki yanıtlardan herhangi biri tarafından çözülemez. Benim durumumdaki belirtilerden biri, uygulamanın simülatörde olmayan cihazda çalışmasıydı. Muhtemelen kullandığınız tüm çerçevelerle ilgili çok sayıda hata göreceksiniz.

Düzeltme aslında oldukça basit. HEDEFLER> Oluşturma Ayarları> Arama Yolları bölümünüzde bulunan "Çerçeve Arama Yolları" ayarından bir girişi silmeniz yeterlidir ("Tümü" sekmesinin seçili olduğundan emin olun)

resim açıklamasını buraya girin

Burada ana hedef (ler) iniz veya test hedefiniz için başka bir giriş görürseniz ($ (devralınmış) dışında), hatalı yolu tüm hedeflerden silin ve yeniden oluşturun.


5

Objective-C dosyaları olan bir klasörü projenize sürüklediğinizde de bu olabileceğini buldum. Bu klasör mavi görünüyorsa, doğru bağlanmadığını gösterir. Her yeni dosya eklediğinizde pbxproj dosyasının bu yeni dosyalara bağlantılar ile güncellenmesi gerektiğinden (sürüm denetimini kullanırsanız) bunu doğrulayabilirsiniz. Ancak, bir klasör ekledikten sonra pbxproj dosyasının değişmediğini (ve dolayısıyla bir bağlantı hatası olduğunu) görebilirsiniz. Böylece otomatik tamamlama çalışmasını alacaksınız ve içe aktardığınız sınıfları bulacak, ancak görüntüyü oluşturmaya başladığında bu hata koduyla başarısız oluyor.

Çözüm klasörü eklemek değil, dosyaları eklemektir. Bunu yapın ve pbxproj dosya güncelleştirmesini görmelisiniz ve bu hatayı düzeltmelidir.

Bu ayrıca yukarıda önerilenleri yaptığınızı ve tüm doğru çerçeveleri doğru bir şekilde bağladığınızı varsayar.


5

Burada hemen hemen her şeyi denedim ama benim sorunum önceki bir cocoapods inşa kalıntıları olduğu ortaya çıktı. Benim için işe yarayan şuydu:

  1. rm -Rf Pods; pod install
  2. Türetilmiş Verileri Sil (Pencere / Projeler ... hedefinizi seçin. Sil Düğmesine tıklayın)
  3. yeniden inşa etmek

4

Aynı hatayla karşılaştım, çünkü bir dosyayı silmek yerine sadece referansları kaldırdım. Dosyanın Finder'da bulunması ve kaldırılması yardımcı oldu.


3

Biliyorum bu eski bir soru ama bugün aynı hatayı aldı ve yukarıdaki çözümlerin hiçbiri işe yaramadı.

Ancak seçeneği ayarlayarak düzelttiniz:

Project -> Architecture -> Build Active Architecture Only

Evet

ve proje düzgün bir şekilde derlenir ve oluşturulur


3

Bu sorunla birçok kez karşılaştım. Bu genellikle derleme klasörünüzü sildiğinizde gelir.

Kolay çözüm, pod dosyalarını yeniden entegre etmek ve kurmaktır.

pod deintegrate
pod install

2

Bir C dosyasına bağlanmaya çalışırken bu hatayı alıyorsanız, önce işlev adlarında yazım hatası olup olmadığını iki kez kontrol edin. Ardından, extern C {}yapıyı kullanmadan bir C ++ / Objective-C ++ ortamından bir C işlevi çağırmaya çalışmadığınızı bir kez daha kontrol edin . Saçlarımı yırtıyordum çünkü C fonksiyonlarını çağırmaya çalışan bir .mm dosyasındaki bir sınıfım vardı. Çalışmıyor çünkü C ++ 'da semboller karıştırılıyor. Aslında nm aracı kullanılarak üretilen 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

Bununla demonte edilen C ++ sembollerini inceleyebilirsiniz:

nm -gC file.o

2

Benim durumumda, Dağıtım hedefi 9.1 olarak ayarlanmış özel bir çerçeve oluşturdum, ancak uygulamamın Dağıtım hedefi daha düşüktü, bu da 8.1'i destekliyor. Özel çerçeveyi en aza indirin Dağıtım hedefi sorunumu çözdü.


2

Partiye geç kaldım ama bunun olabileceği bir senaryoyu paylaşmayı düşündüm. Bir çerçeve üzerinde çalışıyordum ve onu cocoapod'lara dağıtıyordum. Çerçeve hem objektif c hem de hızlı sınıflara ve protokollere sahipti ve başarılı bir şekilde inşa ediliyordu. Pod'u başka bir çerçevede veya projede kullanırken, podspec'e .m dosyalarını dahil etmeyi unuttuğum için bu hatayı veriyordu. Lütfen podspec kaynaklarınıza .swtift, .h ve .m dosyalarını aşağıdaki gibi ekleyin: s.source_files = "Projectname / Projectname / ** / *. {Swift, h, m}"

Umarım başkasının zamanından tasarruf sağlar.



1

Benim için bu birleşme çatışmasından sonra olmaya başladı.

Yapı klasörünü temizlemeye ve kaldırmaya çalıştım, ancak hiçbiri yardımcı olmadı. Bu sorun ne olursa olsun gerçekleşmeye devam etti. Sonra sorunlu olan ve projeye yeniden eklenen grupları silerek referansı yeniden bağladım ve işe yaradı.



1

benim durumumda eklemek zorunda kaldım

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
pod dosyama kopyalayın ve / Pods dizinini silin ve "pod install" komutunu çalıştırın

(Xcode 10.1)


1

Bu birine yardımcı olabilir. Sonunda çözmem günlerimi aldı. OBJ-C'de çalışıyorum ve gittim:

Project-> Build Phases-> Compile sourcesve yeni eklediğim yeni VC.mdosyayı ekledim.

Eski kod ile çalışıyorum ve OBJ-C için yeni bir swifty, bu yüzden .mdosyalarımı bir kaynak kütüphanesine aktarmayı bile düşünmedim .

DÜZENLE:

Bu sorunla ikinci kez karşılaştık ve bu başka bir şeydi. Bu yanıt 5 saat hata ayıklamadan sonra beni kurtardı. Bu konudaki tüm seçenekleri ve daha fazlasını denedim. https://stackoverflow.com/a/13625967/7842175 Bu size yardımcı olursa lütfen ona kredi verin, ancak temelde dosyanızı dosya denetçisindeki hedefine ayarlamanız gerekebilir.

Bu dosya denetçiniz, ihtiyacınız olan tüm hedeflerin "işaretlendiğinden" emin olun

Sonuçta, bu bir çok nedenden kaynaklanabilecek çok belirsiz bir Hata kodudur, bu yüzden farklı seçenekleri denemeye devam edin.


1

Bazen kütüphaneyi Release-universal'den ve yanlışlıkla Release-iphoneos'tan kopyalamayı unutuyorum. Genellikle Release-iphoneos X86 için budanmış .a dosyası içerir. ve böylece hata veriyor.


1

benim durumumda, hedef üyelik seçimini kaldırdıktan sonra tekrar seçerek sorunu giderin.

William Cerniuk'un cevabı ek fotoğrafı ile kontrol edin.


0

Benim durumumda çerçeve mimarisi derlendi.
Koşuyorum Xcode 11 ve kullanma Swift 5.1

  • 3 hedefim vardı:
    • Uygulamam
    • MyAppTests
    • MyAppFrameWork

Testleri çalıştırmaya çalıştım, ancak MyAppFrameWork ürünü Genel iOS Cihazları için derlendi ve Test hedefinin x86-64 koluna ihtiyacı vardı, Bu yüzden iOS Simülatörleri için Çerçeveyi yeniden oluşturdum ve test vakaları başarıyla çalışmaya başlıyor.

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.