Błąd kompilacji Xcode „Niezdefiniowane symbole architektury x86_64”

168

Pytanie początkującego Xcode:

To moje pierwsze doświadczenie z Xcode 4.6.3.

Próbuję napisać bardzo prosty program konsoli, który wyszukuje sparowane urządzenia BT i drukuje je do NSLog.

Kompiluje się z następującym błędem:

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)

Szukałem jak szalony. Typowym problemem powinno być odniesienie do pliku, z którego importowane są tylko pliki nagłówkowe, a konsolidator nie może znaleźć implementacji (* .m-file). Jednak biblioteka IOBluetooth jest standardową strukturą, taką jak Foundation Framework.

Czego mi brakuje w powyższym zestawieniu?

Próbowałem również zbudować go dla maszyny 32-bitowej (kompilacja znowu się nie udała). Jest to oczywiście błąd konsolidatora, jednak nie mam pojęcia, do czego się odnosi, poza tym, że jest problem ze znalezieniem implementacji dla IOBluetoothDevice, zarówno w architekturze x86, jak i x64, podczas gdy pliki nagłówkowe pochodzą ze standardowego Framework o nazwie IOBluetooth?

Dla twojej informacji mój główny kod „main.m” to:

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

Dzięki za wszelką pomoc lub wskazówki we właściwym kierunku.

Wschodzące słońce
źródło
17
Spróbuj dodać $(inherited)do innych flag konsolidatora , wyczyść i skompiluj.
Resty
1
Kiedy natknąłem się na to, stwierdziłem, że muszę przejść do Inspektora plików, aby znaleźć plik m i zaznaczyć pole w obszarze Członkostwo docelowe, aby wyeksportować (?) Go do modułu, w którym próbowałem go użyć.
Landon Kuhn

Odpowiedzi:

123

Wygląda na to, że brakuje Ci dołączenia IOBluetooth.framework w Twoim projekcie. Możesz go dodać przez:

-Kliknięcie projektu w lewym górnym rogu lewego panelu (niebieska ikona).

- W środkowym okienku kliknij kartę Fazy budowy.

- W sekcji „Połącz pliki binarne z bibliotekami” kliknij przycisk plusa.

-Znajdź IOBluetooth.framework z listy i naciśnij Dodaj.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Dzięki temu konsolidator znajdzie definicje IOBluetooth.framework. Możesz zobaczyć, że framework jest członkiem twojego celu, klikając framework w lewym okienku i widząc członkostwo docelowe frameworka w prawym okienku (uwaga: przeniosłem framework pod grupę Frameworks dla celów organizacji):

wprowadź opis obrazu tutaj

Chris Livdahl
źródło
3
Zadziałało! Wielkie dzięki za włożenie się w wykonanie zrzutów ekranu!
Rising Sun
To samo działa dobrze w przypadku frameworka oAuthIOS. Dodaj platformę OAuthIOS z folderu pods do projektu głównego, który próbujesz zbudować
prodeveloper
1
Szukam IOBluetooth.framework, ale go tam nie ma: S
Menno van der Krift
To dziwne, powinno tam być.
Chris Livdahl
Niesamowite! Zaoszczędziłeś mi kilka godzin!
Bravo Kevin
49

UPD

Apple wymaga użycia architektury arm64 . Nie używaj bibliotek x32 w swoim projekcie

Więc odpowiedź poniżej nie jest już poprawna!


Stara odpowiedź

Nowy Xcode 5.1 ustawia architekturę armv7, armv7s i arm64 jako domyślną.

Czasami może to być spowodowane błędem błąd kompilacji„ Niezdefiniowane symbole architektury x86_64 ”” . Ponieważ niektóre biblioteki (nie Apple) zostały pierwotnie skompilowane dla x32 i nie obsługują x64.

Potrzebujesz więc takiej zmiany „Architektury” celu projektu

NB. Jeśli używasz Cocoapods - powinieneś zrobić to samo dla celu „Pods”.

wprowadź opis obrazu tutaj

Aleksey Potapov
źródło
3
Zasadniczo usunąłem element arm64 z właściwości Valid Architectures. Wtedy, jak pokazano powyżej, będzie zmuszony tylko spojrzeć na to, co jest w prawidłowych architekturach, jak sądzę!
Randika Vishman
@Vishman, cześć! Istnieje dobra odpowiedź TAK, która obejmuje różnicę między Valid Architecturesi Architectures.
Aleksey Potapov
Naprawiono moje powiązane błędy w Xcode 5, gdy próbowałem uruchomić projekt w symulatorze iOS 7.1, w symulatorze iOS 6.x działało domyślnie dobrze, dzięki :)
Zsivics Sanel
@BraveS: Czy po usunięciu architektury arm64 będzie działać na urządzeniu 64-bitowym?
Jayprakash Dubey
1
@JayprakashDubey cześć Wgrałem wbudowany sklep z aplikacjami bez obsługi 64-bitowej, odrzucili moją aplikację. Kiedy próbuję dodać arm64, napotykam błąd podczas kompilacji „Niezdefiniowane symbole architektury x86_64”. jeśli usunę arm64 z architektury. i umieściłem arm64 w prawidłowej architekturze. Czy moja aplikacja jest zatwierdzona ???
SP Balu Kommuri
31

Niezdefiniowane symbole dla architektury x86_64: „_OBJC_CLASS _ $ _ xxx”, odniesienie do: objc-class-ref in yyy.o

Zwykle oznacza to, że wywołujesz „xxx” (może to być framework lub klasa) z klasy „yyy”. Kompilator nie może zlokalizować „xxx”, więc ten błąd występuje.

Musisz dodać brakujące pliki (w tym przypadku „xxx”), klikając prawym przyciskiem myszy folder projektu w oknie nawigatora i wybierając opcję „ Dodaj pliki do„ NazwaTwojego Projektu ”.

Wyskakujące okienko otworzy pliki projektu w Finderze. Tam możesz zobaczyć brakujące pliki i po prostu dodać je do swojego projektu. Nie zapomnij zaznaczyć pola „W razie potrzeby skopiuj elementy ”. Powodzenia!!

zmieszany
źródło
17

Widziałem również ten błąd w Xcode 7.2, gdy dane pochodne uległy uszkodzeniu (w moim przypadku przerwałem kompilację i podejrzewam, że była to główna przyczyna).

Jeśli więc inne rozwiązania (szczególnie Chrisa i BraveS, które podejrzewam, że są bardziej prawdopodobne) nie pasują do Twojego problemu, spróbuj usunąć dane pochodne (Wybierz: Okno / Projekty / Dane pochodne -> Usuń) i ponownie zbudować.

(Dodane przez innych w celach informacyjnych - wiem, że odpowiedź na oryginalne pytanie jest poprawna).

Ali Beadle
źródło
14

W Xcode 9.0b5 możesz napotkać ten problem, ponieważ Xcode 9.0b5 ma błąd, w którym po dodaniu kodu źródłowego nie honoruje ustawień docelowych. Musisz wejść i ustawić cel każdego pliku ręcznie po słowach:

Projekt Xcode z ilustracją ręcznego członkostwa docelowego

William Cerniuk
źródło
13

W moim przypadku to nie była biblioteka, to były jakieś zajęcia ...

Niezdefiniowane symbole dla architektury x86_64:
„_OBJC_CLASS _ $ _ ClassNmae”, odniesienie z: objc-class-ref in SomeClassName ”...

d: nie znaleziono symboli dla architektury x86_64

clang: error: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)

Rozwiązanie Miałem kilka celów w Xcode z kilkoma schematami (produkcja, programowanie itp.). Brakowało niektórych nowo dodanych implementacji (Class.m) w

Xcode-> Targets-> Build Phases-> Compile Sources

Musiałem więc dodać je ręcznie.

wtedy mógłbym pomyślnie skompilować i zbudować.

Udaya Sri
źródło
to rozwiązało mój problem. Używałem dynamicznego frameworka. inną rzeczą jest to, że nie podoba mi się pomysł ręcznego dodawania.
toksykon
9

Napotkałem również ten sam problem, powyższe metody nie zadziałają. Przypadkowo usunąłem pliki w następującym katalogu. wprowadź opis obrazu tutaj

Lub

~ / Library / Developer / Xcode / DerivedData /

wprowadź opis obrazu tutaj

ylgwhyh
źródło
4
Dla tych, którzy zastanawiają się, jaka jest rzeczywista ścieżka / polecenie: to przez ~/Library/Developer/Xcode/DerivedData/ CLI możesz wyczyścić katalog w następujący sposób:rm -rf ~/Library/Developer/Xcode/DerivedData/
Bramus
6

Podczas aktualizacji do Xcode 7.1 możesz zobaczyć ten typ błędu i nie można go rozwiązać żadną z powyższych odpowiedzi. Jednym z objawów w moim przypadku było to, że aplikacja działa na urządzeniu, a nie w symulatorze. Prawdopodobnie zobaczysz ogromną liczbę błędów związanych z prawie wszystkimi używanymi frameworkami.

Poprawka jest w rzeczywistości dość prosta. Wystarczy usunąć wpis z ustawienia „Framework Search Paths” znajdującego się w sekcji DOCELOWE> Ustawienia kompilacji> Ścieżki wyszukiwania (upewnij się, że wybrana jest karta „Wszystkie”)

wprowadź opis obrazu tutaj

Jeśli zobaczysz tutaj inny wpis (oprócz $ (inherited)) dla głównego celu (-ów) lub celu testowego, po prostu usuń błędną ścieżkę ze wszystkich celów i odbuduj.

Whyoz
źródło
5

Odkryłem, że może się to również zdarzyć, jeśli przeciągniesz folder z plikami Objective-C do swojego projektu. Jeśli ten folder jest niebieski, myślę, że oznacza to, że nie jest poprawnie połączony. Możesz to sprawdzić (jeśli używasz kontroli wersji), ponieważ za każdym razem, gdy dodasz nowe pliki, plik pbxproj powinien zostać zaktualizowany o łącza do tych nowych plików. Jednak może się okazać, że po dodaniu folderu plik pbxproj nie zmienił się (i dlatego wystąpił błąd łączenia). Dzięki temu autouzupełnianie będzie działało i odnajdzie zaimportowane klasy, ale kiedy rzeczywiście zbuduje obraz, nie powiedzie się z tym kodem błędu.

Rozwiązaniem jest nie dodawanie folderu, ale raczej dodanie plików. Zrób to i powinieneś zobaczyć aktualizację pliku pbxproj, która powinna naprawić ten błąd.

Zakłada się również, że zrobiłeś to, co zostało zasugerowane powyżej i poprawnie połączyłeś wszystkie właściwe struktury.

Agresor
źródło
5

Próbowałem tutaj prawie wszystkiego, ale moim problemem okazały się pozostałości po poprzedniej kompilacji cocoapods. U mnie zadziałało:

  1. rm -Rf Pods; pod install
  2. Usuń pochodne dane (okno / projekty ... wybierz cel. Kliknij przycisk Usuń)
  3. Odbudować
lonesomewhistle
źródło
4

Miałem ten sam błąd, ponieważ zamiast usunąć plik, po prostu usunąłem do niego odniesienia. Znalezienie pliku w Finderze i usunięcie go pomogło.

Alatoo
źródło
3

Wiem, że to stare pytanie, ale dzisiaj wystąpił ten sam błąd i żadne z powyższych rozwiązań nie zadziałało.

Naprawiliśmy to jednak, ustawiając opcję:

Project -> Architecture -> Build Active Architecture Only

na tak

a projekt kompiluje się i buduje poprawnie

Raphael
źródło
3

Wielokrotnie miałem do czynienia z tym problemem. Zwykle dzieje się tak, gdy usuwasz folder kompilacji.

Prostym rozwiązaniem jest dezintegracja i ponowna instalacja plików pod.

pod deintegrate
pod install
Anirudha Mahale
źródło
2

Jeśli otrzymujesz ten błąd podczas próby połączenia z plikiem C, najpierw sprawdź dokładnie nazwy funkcji pod kątem literówek. Następnie sprawdź dokładnie, czy nie próbujesz wywołać funkcji C ze środowiska C ++ / Objective-C ++ bez użycia extern C {}konstrukcji. Wyrywałem sobie włosy z głowy, ponieważ miałem zajęcia w pliku .mm, które próbowały wywołać funkcje C. To nie działa, ponieważ w C ++ symbole są zniekształcone. W rzeczywistości możesz zobaczyć konkretne symbole wygenerowane za pomocą narzędzia nm. Terminal do ścieżki plików .o i uruchom nm -gplik, który wywołuje symbol i ten, który powinien mieć ten symbol, i powinieneś sprawdzić, czy pasują do siebie, czy nie, co może dostarczyć wskazówek dotyczących błędu.

nm -g file.o

Możesz sprawdzić symbole C ++ demangled za pomocą tego:

nm -gC file.o
james_alvarez
źródło
2

W moim przypadku zbudowałem niestandardową platformę z celem wdrożenia ustawionym na 9.1, ale cel wdrożenia mojej aplikacji był niższy, który obsługuje 8.1. Zminimalizuj niestandardową strukturę Cel wdrożenia rozwiązał mój problem.

jeffreysuej
źródło
2

Spóźniłem się na przyjęcie, ale pomyślałem, żeby podzielić się jeszcze jednym scenariuszem, w którym mogłoby się to zdarzyć. Pracowałem nad frameworkiem i rozprowadzałem go na cocoapods. Framework miał zarówno obiektywne klasy c, jak i swift oraz protokoły i pomyślnie się budował. Podczas używania poda w innym frameworku lub projekcie dawał ten błąd, ponieważ zapomniałem dołączyć pliki .m do podspec. Uwzględnij pliki .swtift, .h i .m w źródłach podspec, jak poniżej: s.source_files = "Nazwa projektu / Nazwa projektu / ** / *. {Swift, h, m}"

Mam nadzieję, że oszczędza to czas kogoś innego.

Pranav Gupta
źródło
2

Zostało to rozwiązane przez dodanie „-lc ++” w innych flagach konsolidatora w ustawieniach kompilacji.

Krishna Mudhiraj
źródło
1

U mnie zaczęło się to dziać po konflikcie scalania.

Próbowałem wyczyścić i usunąć folder kompilacji, ale nic z tego nie pomogło. Ten problem wciąż się powtarzał. Następnie ponownie połączyłem odniesienie, usuwając grupy, które były problematyczne, i ponownie dodane do projektu i zadziałało.

green0range
źródło
1

Może również znajdować się #include <windows.h>w pliku .c, który próbujesz skompilować.

Lorenzo Andraghetti
źródło
1

w moim przypadku musiałem dodać

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
do mojego pliku podfile, a następnie usuń katalog / Pods i uruchom `pod install`

(Xcode 10.1)

Brooks DuBois
źródło
1

To może komuś pomóc. Zajęło mi dni, zanim w końcu to rozgryzłem. Pracuję w OBJ-C i poszedłem do:

Project-> Build Phases-> Compile sourcesi dodałem nowy VC.mplik, który właśnie dodałem.

Pracuję ze starszym kodem i zwykle jestem szybki, nowy w OBJ-C, więc nawet nie pomyślałem o zaimportowaniu moich .mplików do biblioteki źródeł.

EDYTOWAĆ:

Napotkałem ten problem po raz drugi i to było coś innego. Ta odpowiedź uratowała mnie po 5 godzinach debugowania. Wypróbowałem wszystkie opcje w tym wątku i nie tylko. https://stackoverflow.com/a/13625967/7842175 Proszę dać mu uznanie, jeśli to ci pomaga, ale w zasadzie może być konieczne ustawienie pliku docelowego w inspektorze plików.

To jest Twój inspektor plików, po prostu upewnij się, że wszystkie potrzebne cele są zaznaczone

Podsumowując, jest to bardzo niejasny kod błędu, który może być spowodowany z wielu powodów, więc wypróbuj różne opcje.

valeriana
źródło
1

Czasami zapomniałem skopiować bibliotekę z Release-universal i omyłkowo skopiować z Release-iphoneos. Zwykle Release-iphoneos zawiera plik .plik, który został przycięty dla X86. i tak daje błąd.

Saleh Enam Shohag
źródło
1

w moim przypadku usunięcie wyboru docelowego członkostwa, a następnie ponowne wybranie rozwiązuje problem.

Sprawdź odpowiedź Williama Cerniuka ze zdjęciem załącznika.

user1105951
źródło
0

W moim przypadku problemem była skompilowana architektura frameworka.
Używam Xcode 11 i Swift 5.1

  • Miałem 3 cele, takie jak:
    • MyApp
    • MyAppTests
    • MyAppFrameWork

Próbowałem uruchomić testy, ale produkt MyAppFrameWork został skompilowany dla Generic iOS Devices, a cel Test potrzebował ramienia x86-64, więc przebudowałem Framework dla symulatorów iOS i przypadki testowe pomyślnie zaczęły działać.

Mohammad Reza Koohkan
źródło