2014-10-06 15 views
7

Hızlı bir sınıfta bir objc kütüphanesi ve bir objc sınıfı kullanmak istiyorum. Bu yüzden Köprü-Header.h aşağıdaki yerleştirin:Bridging Header'da "Redefinition" ve "Duplicate Protocol" tanım hatalarını nasıl önlerim

#import <FooLibrary/FooLibrary.h> 
#import "FooClass.h" 

sorun ben gibi hatalar yüzlerce almak derleme yaparken FooClass.h Yani

#import "FooLibrary.h". 

sahip olmasıdır: "Yeniden Tanımlanması numaralayıcısı "ve" Mülkün önceki tanımı "ve" Çoğaltılmış protokol tanımı "ve" Typedef yeniden tanımı "

Bundan nasıl kurtulurum? Görünüşe göre bu sadece aptalca bir zihinsel engel. Benim yaşadığım ama burayı geçemiyorum.

PartiallyFinite ben proje geniş arama yaptı #include

izlemek önerdi ve ben ve hiç kullanmadan. Kütüphanede birkaç tane var. Hatalardan birini seçtim. dekorasyon olduğu dosya ikinci #import dolaylı ithal FooLibrary.h başlık nedense sadece yukarıdaki dahil dosya ile aynı dosya olmadığını inanmak önişlemci neden olan #include

+1

Bu, otomatik olarak önlenmelidir, çünkü # içe aktarma, her dosyanın yalnızca bir kez içe aktarıldığından emin olur. Yanlışlıkla '# include 'yerine bir yerde kullanmadığınızdan emin misiniz? ('# include ', dosyaların yalnızca bir kez alındığından emin olmak için çek içermez) – Greg

+0

@PartiallyFinite, düzenlememe bakın. Yorum için teşekkürler. Bunu kontrol etmemiştim, ama hala problem gibi görünmüyor. –

cevap

9

şeye benziyor ile herhangi bir dosyaya dahil hiçbir zaman o. ile ilgili en iyi tahminim,, ilk, çerçeve stili içe aktarma işleminiz, oluşturma sırasında bir yapıt konumuna kopyalanan üstbilgi dosyalarına başvuruyorken, ikinci, doğrudan dosya içe aktarma, proje dizininizde olduğu gibi başlık dosyasını başvuruyor olmasıdır Bu, ön işlemcinin onları iki ayrı dosya olarak görmesi anlamına gelir ve iki kez içe aktarılır. düzeltmek için

Önerilen yolları:

  1. dahil edebileceğiniz Eğer FooClass.h çerçeve tarzı ithalat sözdizimi kullanılarak (gibi #import <FooLibrary/FooClass.h>), muhtemelen sorunu çözecektir.

  2. her şeyi ikincisi aracılığıyla dolaylı olarak ithal alacak şekilde FooClass.hhepFooLibrary.h dahil, muhtemelen sadece, tamamen birinci ithalat atlayabilirsiniz olacağını kesinlikle eminseniz.

    // FooLibrary.h 
    
    #pragma once // Maybe even throw in one of these for good measure; 
          // since we're dealing with an obscure-sounding bug, 
          // may as well try to fix it in all of the possible ways 
    
    #ifndef FOOLIBRARY_IMPORTED 
    #define FOOLIBRARY_IMPORTED 
    ... // actual file contents 
    #endif 
    

    Bu önişlemci Makroya dosyası içe ilk kez tanımlayacaktır:

  3. Aksi takdirde, bazı güzel, eski kafalı korumaları arasında (size varsayarak kütüphane başlıklarına yazma erişimine sahip) deneyebilirsiniz Böylece, ön işlemcinin dosyayı içe aktarmaya çalıştığı ikinci seferde, önceden tanımlanmış makro, içeriğin ikinci kez içe aktarılmasını engelleyecektir. Bu anlamıyla #include üzerindeki tek amacı ve avantaj, ama bu onu düzeltir eğer ¯ gibi ben #import sizin durumunuzda yapmıyor anlamak için başarısız \ _ (ツ) _/¯

+0

1. Sınıf "#import" FooLibrary.h '' #import 'olarak değiştirdim ve bu düzeltildi. (# 1 ile söylemek istediğin şey bu mu? Bundan ne anladım ama neyin işe yarayıp yaramadığını bana sordu.) –

+0

2. Birkaç uyarı ile çalıştım.Sadece birkaç senaryodan geçeceğim Senaryo 1 çalıştı: #import 'köprüleme başlığından Senaryo 2 başarısız oldu: Köprüleme başlığından' #import 'öğesini kaldırın FooClass.h, #import öğesinden köprüleme-header 'AnotherFooClass.h" #import "FooLibrary.h' - bu aynı sorunu üretir. Denemedim 3. –

+1

@ LucasGoossen # 1 ile söylüyorum. Başlık dosyalarınız derleme sırasında bir yere kopyalanır ve kopyalarının orijinaliyle olduğu gibi aynı olduklarını anlamadan içe aktarılıyordu. – Greg

3

Bu cocoapods tarafından da neden olabilir - farklı bir sürüme yükseltme veya alt sürüme geçirmeyi deneyin ve yeniden pod install

+0

Yukarıda belirtilen öneride cocoapod kullanıyorum ve 1. benim için çalıştı – Remover

2

Yeniden Çalıştır Benim için Xcode'u yükselttiğimde oluyordu. Tüm yaptığım, Build Build klasörünü temizlemek ve tekrar koşmaktı ve işe yaradı!

İlgili konular