Xcode altında x86_64 mimarisi için yinelenen semboller


219

Şimdi yukarıdaki başlık ile aynı soru var ama henüz doğru cevabı bulamadım. Hatayı aldım:

    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
duplicate symbol _OBJC_METACLASS_$_MoboSDK in:
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Intermediates/TestMoboSDK-Client.build/Debug-iphonesimulator/TestMoboSDK-Client.build/Objects-normal/x86_64/MoboSDK.o
    /Users/nle/Library/Developer/Xcode/DerivedData/TestMoboSDK-Client-cgodalyxmwqzynaxfbbewrooymnq/Build/Products/Debug-iphonesimulator/libMoboSDK.a(MoboSDK.o)
ld: 75 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Herhangi bir yardım takdir.

Nihayet  Eklediğim bu hata nedeni nedenini öğrenmek -ObjCiçin Other Linker Flags. Bu değeri kaldırdıktan sonra projemi başarıyla oluşturabilirim, ama nedenini bilmiyorum. Herkes bunu açıklayabilir mi?


Bağlayıcı, tam olarak 75'ten fazla tanımlı sembollerle karşılaştı. Bunun nedeni bir kereden fazla (muhtemelen ne olursa olsun MoboSDK) olmanız #includeveya #importolmanızdır.
ravron

Bu hata GoogleConversionTrackingSDK-iOS-3.0projeme ekledikten sonra olur.Bundan önce, sorun değil, ben de kaldırmaya çalıştım, ancak hata hala oluyor.
lee

bu senin durumun değil, ben google sdk eklemeden önce benim proje inşa tamam.
lee

Adam Waite'ın ikinci cevabı gerçekten çok basit. Bir yere aktarılan #m dosyası olmadığından emin olun.
Bogdan

Benim durumumda, iki ayrı sınıfta aynı dize dizisi adını kullanmaya çalışıyordum. Sınıflardan birinde dizi adını değiştirdiğimde bu hata kaldırıldı.
Umut

Yanıtlar:


109

75 x86_64 mimarisi için yinelenen semboller

Aynı işlevleri iki kez yüklediğiniz anlamına gelir. Mesele olarak çıkardıktan sonra kaybolur -ObjCdanOther Linker Flags, işlevler yükler iki kez bu yollarla bu seçenek sonucu:

Teknik Soru ve Cevaplardan

Bu bayrak, bağlayıcının kütüphanedeki Objective-C sınıfını veya kategorisini tanımlayan her nesne dosyasını yüklemesine neden olur. Bu seçenek genellikle daha büyük bir yürütülebilir dosya ile sonuçlanır (uygulamaya yüklenen ek nesne kodu nedeniyle), varolan sınıflarda kategoriler içeren etkili Objective-C statik kitaplıklarının başarıyla oluşturulmasına izin verir.

https://developer.apple.com/library/content/qa/qa1490/_index.html


1
Başka bir deyişle, xcode projenizdeki tüm nesne dosyalarını kaldırdığınızdan emin olun.
Klavikula'da Varsayımsal

5
Benim için de işe yarıyor ama diğer kütüphanelerim -ObjCbayrağa bağlı . Bu yüzden bu bayrağı proje ayarlarımda tutmam gerekiyor. Başka bir çözüm önerebilir misiniz?
Sunil Targe

3
Sanırım tüm kütüphanelerinizi gözden geçirmeniz gerekiyor: Yinelenen linker hatası alıyorsanız, bu, 2 veya daha fazla kütüphanede aynı kaynak koduna sahip olduğunuz anlamına gelir.
David V

Reaco
Coty Embry

Benim durumumda ithalat .m dosyası var. Çok aptalca bir hata. Bir kez .h dosyasını içe aktardım. Yapı için hazır !! Teşekkürler
Ravi

261

Benim için 'Ortak Blok Yok'u Evet'ten Hayır'a değiştirmek (Hedefler-> Derleme Ayarları-> Apple LLVM - Kod Üretimi altında) sorunu çözdü.


3
Bu benim sorunumu çözdü. Bunu tekrar değiştirmek gerekiyor NOmu? Bunun arkasındaki sebep nedir?
Hemang

3
Evet, bu sorunu çözer, ancak arkasındaki sebep değildir. Bir sabit tanımladıysanız, tanımlamanın uygun olduğundan emin olun. Benim durumumda "extern" i unuttum. Bu Sauvik Dolui cevabında belirtilmiştir.
Coco

10
Xcode 8, otomatik güncellemelerinden biri olarak bu değişikliği
istedi ve yapımımı

1
2 saat geçtikten sonra, bu cevap bu sorun nedeniyle çözüldü. Teşekkürler
Manish Pathak

1
Bu çalışıyor, ancak hedef ve projede değiştirmek zorunda kaldım
Nooblhu

251

Aptalca, ama #importbir .mdosyayı yanlışlıkla bir yerde düzenlemediğinizden emin olun


3
Bunu yapmamıştım, ancak bu çözüm, yanlışlıkla bir .h dosyasında @interface bloğunun dışında bir değişken bildirmek için yaptığım şeyi bulmama yardımcı oldu.
Scooter

Birim sınamaları kullanılırken, yalnızca .m dosyası oluşturulur. Her ne kadar bu en iyi çözüm değil sanırım bunun için bir başlık dosyası oluşturdu - bir temel test sınıfı oluşturmak istedim.
Bruno Muniz

Bu kadar aptalca bir hata yapma ihtimalim için fikrimi aydınlattığın için çok teşekkür ederim.
Daniel Lima

projeler arası ithalat .m dosyası nasıl?
noveleven

54

Benim durumumda, böyle sabit dizeleri tanımlamak için sadece bir başlık dosyası oluşturdum:

NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

Bu senaryoyu kullanarak çözdüm static:

static NSString *const AppDescriptionString = @"Healthy is the best way to keep fit";

2
bu benim için sorunu çözdü. İ öneki rağmen externyerine static: extern NSString * const kNotificationName;. Hangi garip, çünkü u genellikle böyle bir önek eklemedi ve iyi çalıştı ..
user1244109

Bu, bir nedenden dolayı sorunumu çözdü. Teşekkürler. Derleyicinin neden yinelenen sembollerden daha iyi bir yanıt veremediğini anlamıyorum, ki bu hiç alakalı değil.
Sirenler

@Sirens, ayrıca LLVM derleyicisinden daha iyi bir hata mesajı bekledim. Neyse 2 gün sonra hatayı bulmak için yeterince şanslıydım. :(
Sauvik Dolui

bu da benim sorunumdu, neden asıl sorun bundan kaynaklanıyor?
Fatlad

Bu, tüm değişkenler AppStrings.hsabitse iyi olur , ancak üstbilgi dosyasını içeren her kaynak dosya değişkenin kendi kopyasına sahip olacağı için genel değişken bir değişken istiyorsanız havok'a neden olur. Kötü bir çözüm.
trojanfoe

32

Soruna kabul edilen cevap dokunuşlarını buldum, ancak çözmeme yardımcı olmadı, umarım bu cevap bu çok sinir bozucu sorunda yardımcı olacaktır.

duplicate symbol _OBJC_IVAR_$_BLoginViewController._hud in:

17 duplicate symbols for architecture x86_64

"Aynı işlevleri iki kez yüklediğiniz anlamına gelir. -ObjC'yi Diğer Bağlayıcı Bayraklarından kaldırdıktan sonra sorun ortadan kalktığından, işlevlerin iki kez yüklendiği bu seçenek sonucu şu anlama gelir:"

Layman'ın terimleriyle bu, projemizde tamamen aynı ada sahip iki dosyamız olduğu anlamına geliyor. Belki bir projeyi başka bir projeyle birleştiriyorsunuzdur? Hangi klasör çoğaltıldığını görmek için "yinelenen semboller" hata yukarıdaki hatalara bir göz atın, benim durumumda BLoginViewController oldu.

Örneğin, aşağıdaki resimde iki BImageViewController'ım var, benim için soruna neden olan şey bu.

Birini sildiğim anda sorun ortadan kayboldu :)

resim açıklamasını buraya girin


2
Büyük yardım, teşekkür ederim. Cocoapod kullanan bir projenin yedeğini aldım. Yedeklemeyi Xcode'a yeniden yüklediğimde ve oluşturmayacağını bulduğumda çalışma alanını açmam gerektiğini unutmadan, AFNetworking'i doğrudan projeye ekledim. Daha sonra, bağımlılık olarak AFNetworking'i içeren ve projeme eklediğim orijinal AFNetworking klasörünü kaldırmayı unuttum cocoapod'larımı yeniden kurmaya devam ettim.
JanB

32

Aynı problemim var. Proje Hedefi> Yapı Ayarı> Ortak Blok Yok yolundaki Xcode 7.2'de NO olarak değiştiririm.


4
Benim sorunum buydu. Xcode 8'in uyguladığı bir ayardı. Teşekkürler!
Robert J. Clegg

30

Farklı sınıfta aynı ada sahip const değişkenlerini bildirdiğinizde de olur:

Message.m dosyasında

const int kMessageLength = 36;

@implementation Message

@end

Chat.m dosyasında

const int kMessageLength = 20;

@implementation Chat

@end

1
Const değil ama değişken adını değiştirdiğimde benim için çalıştı
Oktay

İki farklı sınıfların @implementation tanımlanan kendi sınıf değişkeninin bir işaretçi ile bu vardı
Ammianus

Derleme zamanında, derleyici yalnızca başlık (.h) dosyalarında yinelenen sembolleri (burada genel değişkenler) denetler. Ama bağlama anda uygulanmasında (global) değişkenler (.m) dosyaları da kontrol edilip olan kopya var ise, Bağlayıcı olacak yanılmayla: yinelenen sembol _xyz
Pankaj VERMA

30

İki yıl önce Objective-C'de geliştirdiğim bir projede "önerilen ayarlar" pop-up'ını kabul ettiğimde bu benim başıma geldi.

Sorun, "önerilen ayarlar" güncellemesini kabul ettiğinizde, Xcode'un otomatik olarak değişmesi veya GCC_NO_COMMON_BLOCKS = YES; .

Bu, duplicate symbolgüncellenen projemdeki hata ile derleme başarısız oldu . Değiştim Yani No Common Blocketmek NObenim yapı ayarlarında ve hata gitmişti.


3
Evet, bu bana yardımcı oldu. Xcode 8, eski bir projeyi önerilen ayarlara güncelledi. Bunu geri aldım ve tekrar gitmekte fayda var. Teşekkürler!
Zoltán

2
Aferin. Bana çok yardım etti! Senin için yukarı oy! ;-)
Helen Wood

1
Brilliant mate :)
Burf2000 23:17

16

Kopyayı bulmanın en hızlı yolu:

  1. Hedeflere Git
  2. Yapı Aşamalarına Git
  3. Derleme Kaynaklarına Git
  4. Yinelenen dosyaları silin.

Aman tanrım, bu benim durumumdu, çok teşekkürler! Şimdi sana hayatımın 4 saatini ve biraz bira borçluyum :)
Miroslav

1
rica ederim, ama hayır teşekkürler içmem :) mutlu kodlama.
J. Goce

Buna birkaç saat daha ekleyin.
CJ_COIMBRA

Benim için çalıştı! Teşekkür ederim!
redolent

15

Aşağıdaki adımlar benim için sorunu çözdü.

  1. Hedef ayarlarında Aşamaları Oluştur'a gidin.
  2. "İkili Kitaplıklarıyla Bağla" ya gidin
  3. Kütüphanelerden herhangi birinin iki kez var olup olmadığını kontrol edin.
  4. Tekrar derleyin.

13

-ObjC'yi Diğer Bağlayıcı Bayraklarından kaldırın veya Lütfen yanlışlıkla .h yerine herhangi bir .m dosyasını içe aktardığınızdan emin olun.


1
Hey, hala neden -ObjC bayrağının çalışmadığını merak eden herkes - bu cevaba dikkat edin. Tamamen yanlış düşünmüştüm -ObjC bayrağı "süper özel" durumumda çalışmıyor. Projeyi araştırdıktan .m"sonra .h yerine .m dosyasını içe aktardığımı fark ettim ve düzelttikten sonra işe yaradı! Talk is cheap, show me the code!Şerefe!
bgplaya

9

Xcode 7.3'te açılan bazı eski projelerdeki durumum şuydu:

duplicate symbol _SomeEnumState in:

ardından iki alakasız dosya listelendi. o, sonra bu birkaç kez tekrarlandı, sonra nihayet:

ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Benim için çözen, numaralandırma bildirimini şununla değiştirmektir:

enum SomeEnumState {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
} SomeEnumState;

buna:

typedef NS_ENUM(NSUInteger, SomeEnumState) {
    SomeEnumStateActive = 0,
    SomeEnumStateUsed = 1,
    SomeEnumStateHidden = 2
};

Birisi bunun için bir açıklama yaparsa, lütfen beni aydınlatın.


Aynı şey benim için düzeltildi, NS_ENUM için typedef'i değiştirdiğimde, yinelenen semboller hatası düzeltildi
Mark24x7 5:16

9

Aynı değişkenin @ uygulama altında birden fazla sınıfta tanımlanması da bu soruna neden olabilir.


ama neden? Aynı isimlerle sade C fonksiyonları ile bana oldu
vib

9

Benim durumumda, aynı adda iki dosya vardı

Hedefler> Derleme Aşamaları> Kaynakları Derleyin ve yinelenen dosyaları silin.


8
  • Hedeflere Git
  • Derleme Ayarları'nı seçin
  • "Ortak Blok Yok" ifadesini arayın , NO olarak seçin .

Benim için çalıştı


7

Cocoapod'ları kurduktan sonra bu sorunu yaşadım. Bazı bölmeleri her güncellediğimde olur. Bulduğum çözüm:

Terminale git:

1) pod deintegrate
2) pod install

Ayrıca, Yapı Ayarlarınızda "Her Zaman Swift Kitaplıklarını Göm" öğesini kontrol edin. Varsayılan yapılandırmayı kullandığını belirten "soluk" olmalıdır. Manuel olarak EVET olarak ayarlanmışsa, varsayılan yapılandırmaya geri döndürmek için silme tuşuna basın. Bu davranışı durdurdu.


Bu benim için çalıştı. Ancak, "Her Zaman Swift Kitaplıklarını Göm" zaten HAYIR olarak ayarlanmıştı. EVET'e geçtim ve ardından delete tuşuna basıp yukarıda belirtilen kapsül işlevlerini çalıştırdım.
BVB09

5

Benim için Xcode8 önerilen proje ayarları sırasında "Ortak Blok yok" bu soruna neden EVET güncelleştirin.


Eski bir projeye uygulandığında Xcode8.2.1 için de aynı şey geçerli.
onekiloparsec

Bu, XCode
11.3.1'de

5

Bugün aynı hatayı aldım. Hatanın anahtar kelimesi duplicate. Ben düzeltmek:

1. Remove the duplicate file at Build Phases-->Compile Sources
2. If you can not remove it at Build Phases, you need find the file at your project and remove the reference by DELETE :

referansı kaldır

3. Add the file to your project again
4. Add the file's .m to your Build Phases-->Compile Sources again
5. Build your project, the error will disappear

Teşekkürler! Benim durumumda, biri eski referans olan iki main.m derledim. Bu sürükle ve bırak işleminden kaynaklandı.
maşa

4

Yanlışlıkla bir .m dosyasını içe aktarmadığınızdan emin olun, türetilen verilerinizi Projeler Penceresinde silmek ve sonra yeniden oluşturmak ve çalıştırmak isteyebilirsiniz.


4

Bu sorunu yaşayan herkes için, bu cevapların hiçbirinde kararımı görmedim.

Manuel olarak ele alınan (kötü de olsa) bir .pbxproj birleştirme çakışması yaptıktan sonra, .pbxproj dosyasında tek tek sınıf dosyalarına yinelenen başvurular yapıldı. Bunları Proje> Derleme Aşamaları> Kaynakları Derle'den silmek benim için her şeyi düzeltti.

Umarım bu birisine yardımcı olur.


Ayrıca birleşme çatışmaları vardı ve bunları pbxproj dosyasında elle çözmek zorunda kaldı. İle sona erdi ld: X duplicate symbols for architecture x86_64. Hata iletisinde belirtilen kaynak dosyaları kaldırıp yeniden projeye ekleyerek düzeltildi.
kas-kad

4

Juice007'ye benzer şekilde, iki farklı .m dosyasında (içe aktarılmadı!) C tipi bir değişken bildirip başlattım.

BOOL myVar = NO;

ancak, @ uygulamada bile bir değişkeni .m'de bile bildirme ve başlatma yöntemi, ona global kapsam kazandırır. Seçenekleriniz:

  1. Kapsamı sınıfla sınırlamak için statik olarak bildirin:

    static BOOL myVar = NO;
  2. Başlatma işlemini kaldırın (iki sınıfın global var değerini paylaşmasını sağlar):

    BOOL myVar;
    -(void) init{
        myVar = NO;
    }
  3. Mülk olarak beyan edin:

    @property BOOL myVar;
  4. @ Arayüzünde uygun bir iVar olarak ilan edin

    @interface myClass(){
        BOOL myVar;
    }
    @end

4

Benim durumumda, projemde iki main()yöntem tanımladım ve birini kaldırmak sorunu çözdü.


Burada da aynı sorun vardı. Gönderiniz bana yardımcı oldu. Teşekkürler!
Baran Emre

3

Son zamanlarda bir hata kaynağı arayan bir baş ağrısı vardı. Ben sadece farklı sınıflarda aşağıdaki kod snippet'i vardı, çünkü benim app derlemek istemediğini öğrendim, merak ettim:

dispatch_time_t getDispatchTimeByDate(NSDate *date)
{
    NSTimeInterval interval;
    double second, subsecond;
    struct timespec time;
    dispatch_time_t milestone;


    interval = [date timeIntervalSince1970];
    subsecond = modf(interval, &second);
    time.tv_sec = second;
    time.tv_nsec = subsecond * NSEC_PER_SEC;
    milestone = dispatch_walltime(&time, 0);

    return milestone;
}

Umarım bu birine yardımcı olabilir.


küçük yardımcı işlevi, yanlışlıkla kopyalandı, kolayca gözden kaçan - teşekkürler!
Steven A. Lowe

3

Umarım sana kesinlikle yardımcı olur

Aynı hata 3 mimarisi x86_64 için yinelenen semboller aldım

benim durumumda aynı projenin başka bir dosyasından kod kopyaladım örn. Bm Am dosyasının kodu ve derleme sonra söz olarak bir hata var. ve ben global Değişken adını değiştirerek hata var.

benim durumumda bu hata her iki dosyada global değişken için aynı beyan nedeniyle geldi.


3

Bir kapsül deposu eklediğimde aynı hatayı aldım

pod 'SWRevealViewController'

gitHub'dan eklenmiş bir kaynak kodu (SWRevealViewController) için. Bu nedenle, kaynak kod veya kapsül deposu kaldırılarak hata giderilecektir.

Dava # 2:

2 kez, bu hata .h dosyasında bir sabit beyan ettiğimde ortaya çıktı .

NSString * const SomeConstant  = @"SomeValue";
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
...
...

İkinci vaka beni bir gece kurtardı. Teşekkürler!
Pankaj Yadav

3

Yukarıdaki cevaplar benim için işe yaramadı. İşte bunu nasıl buldum:

1) bulucuda, tüm Pods klasörünü ve Podfile.lock dosyasını silin 2) xcode projesini kapatın 3) terminalde pod kurulumunu çalıştırın 4) xcode projesini açın, temiz inşa komutunu çalıştırın

Ondan sonra benim için çalıştı.


2

Lob projesini projeme entegre ederken ben de aynı sorun oldu.

resim açıklamasını buraya girin

Aslında lob projesinde de AFNetworking dosyaları var, bu yüzden lob projesinden .m dosyalarını kaldırıyorum.

resim açıklamasını buraya girin

Aslında .m dosyaları Projem POd / AFNetworking / .m dosyalarıyla çakışıyor

resim açıklamasını buraya girin


2

Xcode 6.3.2'de. Aşağıdaki gibi tüm olasılıkları kontrol ettim

1: Projeme .m dosyası aktarmadım.

2: kaldırıldı -ObjCgelen diğer bağlayıcı bayrak .

3: Tüm veriyi kaldırdım .

hala aynı hatayı alıyorum. Dosyadan herhangi bir değişken bildirimi kaldırarak bu hatayı kaldırdım.pch . benim durumumda, dosyada AppDelegatenesne ilan ettim .pch. sonunda hataya neden olan sebep buldum. bu yüzden .pch dosyasından ve benim proje çalışma cazibemden herhangi bir değişkenin bildirimini kaldırıyorum.


2

Bu hataya neden olacak başka bir aptalca hata tekrarlanan dosyalardır. Bazı dosyaları yanlışlıkla iki kez kopyaladım. İlk önce Hedefler -> Derleme Aşamaları -> Kaynakları derlemeye gittim. Orada bu listede iki dosya ve bunların konumlarını fark ettim.


Birinin seni neden küçümsediğini bilmiyorum, bu sorunumu çözdü.
Yawar

2

Ben de bugün bu hata var.Bu .mbir .mdosyada const değeri tanımladı çünkü.Ama bu const değeri de içeren başka bir dosya tanımladım.Bu iki aynı const değerleri olduğu anlamına gelir.Bu yüzden bu hata görünür. Ve benim çözümüm staticconst değerinin önüne " " anahtar kelimesini eklemek. Böyle:

static CGFloat const btnConunt = 9;

Ve sonra projeyi derledim, bu hatayı rapor etmeyecek.

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.