2012-02-23 12 views
8

Mój problem

otrzymuję "_OBJC_CLASS _ $ ..., odwołuje się od:" Błąd linkera przy kompilacji niektórych projektów Xcode (zdarza się zarówno w iOS i projektów Mac) Mam prawidłowo połączone ram i importu.

konfiguracji

  • jeden cel aplikacja
  • jeden cel testu
  • Wszystkie ramy połączone prawidłowo

Na kompilacji otrzymuję następujące błędy łącznikowe: "_OBJC_CLASS _ $ _ JGCountdownTimer" , wymienione od: objc-class-ref w JGCountdownTimerTestCase.o

dla wielu klas używanych w testach.

Co Próbowałem

  • sprawdzone, że przywóz są obecne
  • Usunięto wszystkie niestandardowe Ramki
  • Gdybym skompilować klasę zarówno cel badań i aplikacji ukierunkowania go naprawia problem. Ale dostaję inne ostrzeżenia od kompilatora.
+2

W swój cel - zbudować Faza sprawdzić, czy plik JGCountdownTimer.m brakuje? – 0x8badf00d

+0

Jak jestem pewien, wiesz, to oznacza, że ​​nazwa (JGCountdownTimer) była używana podczas procesu kompilacji, ale podczas łączenia nie znaleziono pliku obiektu. Czy JGCountdownTimer pochodzi z pliku binarnego lub klasy? Jedyny raz, kiedy miałem z tym problem, był spowodowany odwołaniem cyklicznym. Czy to możliwe? Jeśli tak, użyj dyrektywy @class. Powodzenia. – Avi

+0

Hej, chaps - dzięki za komentowanie. Naprawiłem problem przed opublikowaniem, ale nie znalazłem żadnych innych postów z odpowiedzią, którą znalazłem, więc zadałem pytanie, więc mogłem odpowiedzieć na nie osobiście i mam autorytatywną odpowiedź! –

Odpowiedz

11

Szybka odpowiedź

Kopiuj i wklej następujący wiersz do ustawieniach produkcji:

GCC_SYMBOLS_PRIVATE_EXTERN = Nie

W celu ustawienia kompilacji szukać „Symbole domyślnie ukryte” . Do konfiguracji debugowania potrzebujesz "Nie".

Miałem ten problem z przerwami od wielu miesięcy i właśnie odkryłem dlaczego.

+1

Możesz także przedrostek swojego '@ interfejsu' z' __attribute __ ((widoczność ("default"))) ' – Wevah

+0

Hmmm. Miły. Każdego dnia uczysz się czegoś nowego. Dzięki! –

+11

W ustawieniach kompilacji gdzie wkleić to GCC? –

2

Nie jestem pewien, czy to może być problem, ale z nowym kompilatorem, jakiekolwiek obiekty, które nie są jawnie przywoływane/wywoływane, nie będą łączone z bibliotek. Powoduje to problemy podczas implementowania kategorii w bibliotekach.

Spróbuj dodać "-ObjC" do "dodatkowych flag łącznika" w panelu ustawień budowania celu. wzruszyć

+0

Dziękuję za szybką odpowiedź - pisałem o tym, ponieważ znalazłem rozwiązanie, które doprowadziło mnie do szaleństwa CRAZY, że nie mogłem znaleźć odpowiedzi nigdzie indziej, więc pomyślałem, że opublikuję to dla jakiejś innej nieszczęsnej duszy, która dostanie to błąd linkera i nie można zrozumieć, dlaczego. –

+2

Ta odpowiedź jest nieco myląca. Podczas łączenia bibliotek statycznych, domyślnie kompilator (gcc i clang) będzie łączyć tylko członków biblioteki, do których się odwołuje. Określenie flagi łącznika '-ObjC' oznacza połączenie wszystkich elementów, które mają informacje o klasie/kategorii Obj-C. To nie wpływa w ogóle na dylibs lub kod aplikacji, tylko na statyczne biblioteki. –

+0

o oops. wygląda na to, że używasz GCC mimo wszystko, prawda? – nielsbot

10

Miałem podobny problem. Dostałem błąd linkera:

_OBJC_CLASS_$_MyClass

Problemem było to, że ogłoszony @interface dla MyClass ale nie zadeklarowała odpowiadające @implementation.

Rozwiązaniem było po prostu dodać

@implementation MyClass 
@end 
Powiązane problemy