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.
źródło
$(inherited)
do innych flag konsolidatora , wyczyść i skompiluj.Odpowiedzi:
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.
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):
źródło
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”.
źródło
Valid Architectures
iArchitectures
.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!!
źródło
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).
źródło
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:
źródło
W moim przypadku to nie była biblioteka, to były jakieś zajęcia ...
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
Musiałem więc dodać je ręcznie.
wtedy mógłbym pomyślnie skompilować i zbudować.
źródło
Napotkałem również ten sam problem, powyższe metody nie zadziałają. Przypadkowo usunąłem pliki w następującym katalogu.
Lub
~ / Library / Developer / Xcode / DerivedData /
źródło
~/Library/Developer/Xcode/DerivedData/
CLI możesz wyczyścić katalog w następujący sposób:rm -rf ~/Library/Developer/Xcode/DerivedData/
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”)
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.
źródło
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.
źródło
Próbowałem tutaj prawie wszystkiego, ale moim problemem okazały się pozostałości po poprzedniej kompilacji cocoapods. U mnie zadziałało:
rm -Rf Pods; pod install
źródło
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.
źródło
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ę:
na tak
a projekt kompiluje się i buduje poprawnie
źródło
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.
źródło
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 uruchomnm -g
plik, 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.Możesz sprawdzić symbole C ++ demangled za pomocą tego:
źródło
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.
źródło
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.
źródło
Zostało to rozwiązane przez dodanie „-lc ++” w innych flagach konsolidatora w ustawieniach kompilacji.
źródło
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.
źródło
Może również znajdować się
#include <windows.h>
w pliku .c, który próbujesz skompilować.źródło
w moim przypadku musiałem dodać
do mojego pliku podfile, a następnie usuń katalog / Pods i uruchom `pod install`(Xcode 10.1)
źródło
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 sources
i dodałem nowyVC.m
plik, 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
.m
plikó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.
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.
źródło
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.
źródło
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.
źródło
W moim przypadku problemem była skompilowana architektura frameworka.
Używam Xcode 11 i Swift 5.1
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ć.
źródło