Xcode-Build-Fehler "Undefinierte Symbole für Architektur x86_64"

168

Eine Xcode-Anfängerfrage:

Es ist meine erste Erfahrung mit Xcode 4.6.3.

Ich versuche, ein sehr einfaches Konsolenprogramm zu schreiben, das nach gekoppelten BT-Geräten sucht und diese in einem NSLog druckt.

Es wird mit folgendem Fehler erstellt:

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)

Ich suchte wie verrückt. Das häufigste Problem sollte ein Verweis auf eine Datei sein, von der nur die Header-Dateien importiert werden und der Linker keine Implementierung (* .m-Datei) findet. Die IOBluetooth-Bibliothek ist jedoch ein Standard-Framework wie das Foundation Framework.

Was fehlt mir in meiner obigen Aussage?

Ich habe auch versucht, es für einen 32-Bit-Computer zu erstellen (Build schlägt erneut fehl). Es ist eindeutig ein Linker-Fehler, aber ich habe keine Ahnung, worauf es ankommt, außer dass es ein Problem gibt, die Implementierung für IOBluetoothDevice sowohl auf der x86- als auch auf der x64-Architektur zu finden, während die Header-Dateien von einem standardmäßigen enthaltenen Framework stammen, das aufgerufen wird IOBluetooth?

Zu Ihrer Information ist mein Hauptcode "main.m":

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

Vielen Dank für jede Hilfe oder Hinweise in die richtige Richtung.

Aufgehende Sonne
quelle
17
Versuchen Sie $(inherited), andere Linker-Flags hinzuzufügen , zu bereinigen und zu erstellen.
Ruhe
1
Als ich darauf stieß, musste ich zum Dateiinspektor für die m-Datei gehen und das Kontrollkästchen unter Zielmitgliedschaft aktivieren, um sie in das Modul zu exportieren (?), In dem ich sie verwenden wollte.
Landon Kuhn

Antworten:

123

Es sieht so aus, als ob Sie das IOBluetooth.framework in Ihrem Projekt vermissen. Sie können es hinzufügen durch:

-Klicken Sie oben links im linken Bereich auf Ihr Projekt (das blaue Symbol).

- Klicken Sie im mittleren Bereich auf die Registerkarte Phasen erstellen.

- Klicken Sie unter "Binär mit Bibliotheken verknüpfen" auf das Pluszeichen.

-Finden Sie das IOBluetooth.framework aus der Liste und klicken Sie auf Hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Dadurch wird sichergestellt, dass die IOBluetooth.framework-Definitionen vom Linker gefunden werden. Sie können sehen, dass das Framework Mitglied Ihres Ziels ist, indem Sie im linken Bereich auf das Framework klicken und im rechten Bereich die Zielmitgliedschaft des Frameworks anzeigen (Hinweis: Ich habe das Framework aus Organisationsgründen unter die Gruppe "Frameworks" verschoben):

Geben Sie hier die Bildbeschreibung ein

Chris Livdahl
quelle
3
Es funktionierte! Vielen Dank auch für die Mühe, ein paar Screenshots zu machen!
RisingSun
Das gleiche funktioniert gut für das oAuthIOS-Framework. Fügen Sie dem Stammprojekt, das Sie erstellen
möchten
1
Ich suche nach IOBluetooth.framework, aber es ist nicht da: S
Menno van der Krift
Das ist seltsam, es sollte da sein.
Chris Livdahl
Genial! Hat mir ein paar Stunden gespart!
Bravo Kevin
49

UPD

Apple muss die arm64- Architektur verwenden. Verwenden Sie in Ihrem Projekt keine x32-Bibliotheken

Die Antwort unten ist also nicht mehr richtig!


Alte Antwort

Der neue Xcode 5.1 legt die Architektur armv7, armv7s und arm64 als Standard fest.

Und manchmal kann der Fehler "Build-Fehler" Undefinierte Symbole für Architektur x86_64 "" dadurch verursacht werden. Da einige Bibliotheken (nicht die von Apple) ursprünglich für x32 kompiliert wurden und x64 nicht unterstützen.

Sie müssen also die "Architekturen" für Ihr Projektziel wie folgt ändern

NB. Wenn Sie Cocoapods verwenden, sollten Sie dasselbe für das Ziel "Pods" tun.

Geben Sie hier die Bildbeschreibung ein

Aleksey Potapov
quelle
3
Grundsätzlich habe ich das arm64-Ding aus der Valid Architectures-Eigenschaft entfernt. Dann wird es, wie oben gezeigt, nur gezwungen zu schauen, was in den gültigen Architekturen vorhanden ist, denke ich!
Randika Vishman
@Vishman, hi! Es gibt eine gute SO-Antwort , die den Unterschied zwischen Valid Architecturesund abdeckt Architectures.
Aleksey Potapov
Meine verknüpften Fehler in Xcode 5 wurden behoben, als ich versuchte, das Projekt im iOS 7.1-Simulator auszuführen. Im iOS 6.x-Simulator funktionierte es standardmäßig einwandfrei, danke :)
Zsivics Sanel
@BraveS: Funktioniert das Entfernen der arm64-Architektur für 64-Bit-Geräte?
Jayprakash Dubey
1
@ JayprakashDubey Hallo, ich habe einen eingebauten Appstore ohne 64-Bit-Unterstützung hochgeladen. Sie haben meine App abgelehnt. Wenn ich versuche, den arm64 hinzuzufügen, tritt ein Fehler beim Erstellen des Fehlers "Undefinierte Symbole für Architektur x86_64" auf. wenn ich arm64 aus der architektur entferne. und ich habe arm64 in eine gültige Architektur gesetzt. Ist meine App genehmigt ???
SP Balu Kommuri
31

Undefinierte Symbole für die Architektur x86_64: "_OBJC_CLASS _ $ _ xxx", referenziert von: objc-class-ref in yyy.o

Dies bedeutet im Allgemeinen, dass Sie "xxx" (es kann sich um ein Framework oder eine Klasse handeln) aus der Klasse "yyy" aufrufen. Der Compiler kann das "xxx" nicht finden, daher tritt dieser Fehler auf.

Sie müssen die fehlenden Dateien (in diesem Fall "xxx") hinzufügen, indem Sie mit der rechten Maustaste auf Ihren Projektordner im Navigatorfenster klicken und auf die Option " Dateien zu" YourProjectName " hinzufügen " tippen .

Ein Popup-Fenster öffnet Ihre Projektdateien im Finder. Dort können Sie die fehlenden Dateien sehen und sie einfach Ihrem Projekt hinzufügen. Vergessen Sie nicht, das Kontrollkästchen " Elemente bei Bedarf kopieren " zu aktivieren. Viel Glück!!

Verwirrt
quelle
17

Ich habe diesen Fehler auch in Xcode 7.2 gesehen, als die abgeleiteten Daten beschädigt wurden (in meinem Fall habe ich einen Build unterbrochen und vermutet, dass dies die Hauptursache war).

Wenn also die anderen Lösungen (insbesondere die von Chris und BraveS, von denen ich vermute, dass sie wahrscheinlicher sind) nicht zu Ihrem Problem passen, löschen Sie abgeleitete Daten (Wählen Sie: Fenster / Projekte / Abgeleitete Daten -> Löschen) und erstellen Sie sie neu.

(Als Referenz von anderen hinzugefügt - ich weiß, dass die ursprüngliche Frage richtig beantwortet wurde).

Ali Beadle
quelle
14

Unter Xcode 9.0b5 kann dies auftreten, da Xcode 9.0b5 einen Fehler enthält, bei dem beim Hinzufügen von Quellcode die Zieleinstellungen nicht berücksichtigt werden. Sie müssen das Ziel jeder Datei manuell nach den Worten festlegen:

Xcode-Projekt mit manueller Zielmitgliedschaftsillustration

William Cerniuk
quelle
13

In meinem Fall war es keine Bibliothek, es waren einige Klassen.

Undefinierte Symbole für die Architektur x86_64:
"_OBJC_CLASS _ $ _ ClassNmae", referenziert von: objc-class-ref in SomeClassName ".

d: Symbol (e) für Architektur x86_64 nicht gefunden

clang: error: Linker-Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen)

Lösung Ich hatte mehrere Ziele in Xcode mit mehreren Schemas (Produktion, Entwicklung usw.). Einige meiner neu hinzugefügten Implementierungen (Class.m) fehlten in

Xcode-> Ziele-> Phasen erstellen-> Quellen kompilieren

Also musste ich sie manuell hinzufügen.

dann konnte ich erfolgreich kompilieren und bauen.

Udaya Sri
quelle
Dies löste mein Problem. Ich habe ein dynamisches Framework verwendet. Eine andere Sache ist, dass ich die Idee, manuell hinzuzufügen, nicht mag.
Toxicsun
9

Ich habe auch das gleiche Problem festgestellt, die oben genannten Methoden werden nicht funktionieren. Ich habe versehentlich die Dateien im folgenden Verzeichnis gelöscht. Geben Sie hier die Bildbeschreibung ein

Oder

~ / Library / Developer / Xcode / DerivedData /

Geben Sie hier die Bildbeschreibung ein

ylgwhyh
quelle
4
Für diejenigen, die sich fragen, was der eigentliche Pfad / Befehl ist: ~/Library/Developer/Xcode/DerivedData/ Über die CLI können Sie das Verzeichnis wie folgt rm -rf ~/Library/Developer/Xcode/DerivedData/
bereinigen
6

Beim Update auf Xcode 7.1 wird möglicherweise diese Art von Fehler angezeigt, die durch keine der oben genannten Antworten behoben werden kann. Eines der Symptome in meinem Fall war, dass die App auf dem Gerät ausgeführt wird, nicht im Simulator. Sie werden wahrscheinlich eine große Anzahl von Fehlern sehen, die mit so ziemlich allen von Ihnen verwendeten Frameworks zusammenhängen.

Das Update ist eigentlich ganz einfach. Sie müssen nur einen Eintrag aus der Einstellung "Framework-Suchpfade" löschen, die sich in Ihrem Abschnitt ZIELE> Build-Einstellungen> Suchpfade befindet (stellen Sie sicher, dass die Registerkarte "Alle" ausgewählt ist).

Geben Sie hier die Bildbeschreibung ein

Wenn Sie hier (neben $ (geerbt)) einen weiteren Eintrag für Ihre Hauptziele oder Ihr Testziel sehen, löschen Sie einfach den fehlerhaften Pfad von allen Zielen und erstellen Sie ihn neu.

Whyoz
quelle
5

Ich habe festgestellt, dass dies auch auftreten kann, wenn Sie einen Ordner mit Objective-C-Dateien in Ihr Projekt ziehen. Wenn dieser Ordner blau erscheint, weist er meiner Meinung nach darauf hin, dass er nicht richtig verknüpft ist. Sie können dies überprüfen (wenn Sie die Versionskontrolle verwenden), da die pbxproj-Datei beim Hinzufügen neuer Dateien mit Links zu diesen neuen Dateien aktualisiert werden sollte. Möglicherweise stellen Sie jedoch fest, dass sich die Datei pbxproj nach dem Hinzufügen eines Ordners nicht geändert hat (und daher ein Verknüpfungsfehler vorliegt). Sie werden also automatisch arbeiten und die importierten Klassen finden, aber wenn es darum geht, das Image tatsächlich zu erstellen, schlägt es mit diesem Fehlercode fehl.

Die Lösung besteht darin, nicht den Ordner, sondern die Dateien hinzuzufügen. Wenn Sie dies tun, sollte das Update der pbxproj-Datei angezeigt und dieser Fehler behoben werden.

Dies setzt auch voraus, dass Sie die oben vorgeschlagenen Schritte ausgeführt und alle richtigen Frameworks ordnungsgemäß verknüpft haben.

Aggressor
quelle
5

Ich habe hier so ziemlich alles versucht, aber mein Problem waren die Überreste eines früheren Cocoapods-Builds. Was für mich funktioniert hat war:

  1. rm -Rf Pods; pod install
  2. Abgeleitete Daten löschen (Fenster / Projekte ... wählen Sie Ihr Ziel aus. Klicken Sie auf die Schaltfläche Löschen.)
  3. Wiederaufbauen
einsame Pfeife
quelle
4

Ich hatte den gleichen Fehler, weil ich anstelle des Löschens einer Datei einfach Verweise darauf entfernt habe. Das Auffinden und Entfernen der Datei im Finder hat geholfen.

Alatoo
quelle
3

Ich weiß, dass es eine alte Frage ist, aber heute ist der gleiche Fehler aufgetreten und keine der oben genannten Lösungen hat funktioniert.

Habe es aber durch Einstellen der Option behoben:

Project -> Architecture -> Build Active Architecture Only

zu Ja

und das Projekt wird ordnungsgemäß kompiliert und erstellt

Raphael
quelle
3

Ich habe dieses Problem viele Male konfrontiert. Dies tritt normalerweise auf, wenn Sie Ihren Build-Ordner löschen.

Die einfache Lösung besteht darin, die Pod-Dateien zu de-integrieren und erneut zu installieren.

pod deintegrate
pod install
Anirudha Mahale
quelle
2

Wenn beim Versuch, eine Verknüpfung zu einer C-Datei herzustellen, dieser Fehler auftritt, überprüfen Sie zunächst die Funktionsnamen auf Tippfehler. Überprüfen Sie als Nächstes, ob Sie nicht versuchen, eine C-Funktion aus einer C ++ / Objective-C ++ - Umgebung aufzurufen, ohne das extern C {}Konstrukt zu verwenden. Ich habe mir die Haare ausgerissen, weil ich eine Klasse in einer .mm-Datei hatte, die versuchte, C-Funktionen aufzurufen. Es funktioniert nicht, weil in C ++ die Symbole entstellt sind. Sie können die mit dem nm-Werkzeug generierten konkreten Symbole sehen. Terminal zum Pfad der .o-Dateien und führen Sie nm -gdie Datei aus, die das Symbol aufruft , und die Datei, die das Symbol haben soll, und Sie sollten sehen, ob sie übereinstimmen oder nicht, was Hinweise auf den Fehler liefern kann.

nm -g file.o

Sie können die damit entwirrten C ++ - Symbole überprüfen:

nm -gC file.o
james_alvarez
quelle
2

In meinem Fall habe ich ein benutzerdefiniertes Framework mit dem Bereitstellungsziel 9.1 erstellt, aber das Bereitstellungsziel meiner App war niedriger, was 8.1 unterstützt. Minimieren Sie das benutzerdefinierte Framework. Das Bereitstellungsziel hat mein Problem gelöst.

jeffreysuej
quelle
2

Ich bin zu spät zur Party, habe aber darüber nachgedacht, ein weiteres Szenario zu teilen, in dem dies passieren könnte. Ich arbeitete an einem Framework und verteilte es über Cocoapods. Das Framework hatte sowohl objektive c- als auch schnelle Klassen und Protokolle und wurde erfolgreich erstellt. Bei der Verwendung von pod in einem anderen Framework oder Projekt wurde dieser Fehler ausgegeben, da ich vergessen habe, .m-Dateien in podspec aufzunehmen. Bitte fügen Sie .swtift-, .h- und .m-Dateien wie folgt in Ihre Podspec-Quellen ein: s.source_files = "Projektname / Projektname / ** / *. {Swift, h, m}"

Ich hoffe, das spart jemand anderem Zeit.

Pranav Gupta
quelle
2

Ich habe es gelöst, indem ich "-lc ++" in "Andere Linker-Flags" in den Build-Einstellungen hinzugefügt habe.

Krishna Mudhiraj
quelle
1

Für mich begann dies nach einem Zusammenführungskonflikt.

Ich habe versucht, den Build-Ordner zu bereinigen und zu entfernen, aber nichts davon hat geholfen. Dieses Problem trat trotzdem auf. Dann habe ich die Referenz erneut verknüpft, indem ich die problematischen Gruppen gelöscht und dem Projekt erneut hinzugefügt habe, und es hat funktioniert.

green0range
quelle
1

Könnte auch eine #include <windows.h>in der .c-Datei sein, die Sie kompilieren möchten.

Lorenzo Andraghetti
quelle
1

in meinem Fall musste ich hinzufügen

    target 'SomeTargetTests' do
        inherit! :search_paths
    end
in meine Poddatei und lösche dann das Verzeichnis / Pods und führe `pod install` aus

(Xcode 10.1)

Brooks DuBois
quelle
1

Das könnte jemandem helfen. Ich habe Tage gebraucht, um es endlich herauszufinden. Ich arbeite in OBJ-C und ging zu:

Project-> Build Phases-> Compile sourcesund fügte die neue VC.mDatei hinzu, die ich gerade hinzugefügt hatte.

Ich arbeite mit Legacy-Code und bin normalerweise ein schneller, neuer OBJ-C-Mitarbeiter. Daher habe ich nicht einmal daran gedacht, meine .mDateien in eine Quellbibliothek zu importieren .

BEARBEITEN:

Ich bin ein zweites Mal auf dieses Problem gestoßen und es war etwas anderes. Diese Antwort hat mich nach 5 Stunden Debugging gerettet. Versuchte alle Optionen auf diesem Thread und mehr. https://stackoverflow.com/a/13625967/7842175 Bitte geben Sie ihm eine Gutschrift, wenn dies Ihnen hilft, aber im Grunde müssen Sie Ihre Datei möglicherweise im Dateiinspektor auf das Ziel setzen.

Dies ist Ihr Dateiinspektor. Stellen Sie einfach sicher, dass alle benötigten Ziele "angekreuzt" sind.

Alles in allem ist dies ein sehr vager Fehlercode, der aus vielen Gründen verursacht werden kann. Probieren Sie also weiterhin verschiedene Optionen aus.

valeriana
quelle
1

Manchmal vergesse ich, die Bibliothek von Release-universal zu kopieren und fälschlicherweise von Release-iphoneos zu kopieren. Normalerweise enthält Release-iphoneos eine .a-Datei, die für X86 beschnitten wurde. und so gibt es den Fehler.

Saleh Enam Shohag
quelle
1

In meinem Fall kann das Problem behoben werden, indem die Auswahl der Zielmitgliedschaft entfernt und dann erneut ausgewählt wird .

Überprüfen Sie die Antwort von William Cerniuk mit dem Foto des Anhangs.

user1105951
quelle
0

In meinem Fall war das Problem die kompilierte Framework-Architektur.
Ich verwende Xcode 11 und verwende Swift 5.1

  • Ich hatte 3 Ziele wie:
    • Meine App
    • MyAppTests
    • MyAppFrameWork

Es wurde versucht, Tests auszuführen, aber das MyAppFrameWork-Produkt wurde für generische iOS-Geräte kompiliert, und das Testziel benötigte einen Arm x86-64. Daher habe ich Framework für iOS-Simulatoren neu erstellt und Testfälle erfolgreich ausgeführt.

Mohammad Reza Koohkan
quelle