it-swarm.com.de

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

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 auf ein NSLog druckt.

Es wird mit dem folgenden 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 keine Implementierung (* .m-Datei) vom Linker gefunden wird. 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 eine 32-Bit-Maschine zu erstellen (Build schlägt erneut fehl). Es ist eindeutig ein Linker-Fehler, aber ich habe keine Ahnung, worauf es sich bezieht, außer dass es ein Problem gibt, wenn die Implementierung von IOBluetoothDevice sowohl in der x86- als auch in der x64-Architektur gefunden wird, während die Header-Dateien aus einem Standard-Framework stammen 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 jegliche Hilfe oder Hinweise in die richtige Richtung.

130
RisingSun

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

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

- Klicken Sie im mittleren Bereich auf die Registerkarte Buildphasen. 

-Unter "Link Binary With Libraries" klicken Sie auf die Plus-Schaltfläche. 

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

enter image description here

enter image description here

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

enter image description here

105
Chris Livdahl

UPD

Apple erfordert zur Verwendung von arm64 architecture. Verwenden Sie keine x32-Bibliotheken in Ihrem Projekt

Die Antwort unten ist also nicht mehr richtig!


Alte Antwort

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

Und manchmal kann der Fehler "Build-Fehler" Undefinierte Symbole für Architektur x86_64 "" auftreten. Weil einige Bibliotheken (nicht Apples) ursprünglich für x32 kompiliert wurden und x64 nicht unterstützen.

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

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

enter image description here

48
Aleksey Potapov

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

Dies bedeutet im Allgemeinen, dass Sie "xxx" (es kann ein Framework oder eine Klasse sein) aus der Klasse "yyy" aufgerufen werden. 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 " Dateien hinzufügen zu" YourProjectName "" klicken. 

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

25
Confused

Ich habe diesen Fehler auch in Xcode 7.2 entdeckt, wenn 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 Chris und BraveS, von denen ich vermute, dass sie eher wahrscheinlich sind) nicht zu Ihrem Problem passen, versuchen Sie, abgeleitete Daten zu löschen (Auswahl: Fenster/Projekte/Abgeleitete Daten -> Löschen) und neu zu erstellen.

(Zur Referenz hinzugefügt - Ich weiß, dass die ursprüngliche Frage richtig beantwortet wurde).

16
Ali Beadle

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

 Xcode project with manual target membership illustration

11
William Cerniuk

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: Fehler: Linker-Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf von .__ anzuzeigen.)

Solution Ich hatte mehrere Ziele in Xcode mit verschiedenen Schemata (Production, Dev usw.) 

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

Also musste ich sie manuell hinzufügen. 

dann konnte ich erfolgreich kompilieren und bauen. 

11
Udaya Sri

Ich bin auch auf das gleiche Problem gestoßen, die oben genannten Methoden funktionieren nicht. Ich habe versehentlich die Dateien im folgenden Verzeichnis darauf gelöscht . enter image description here

Oder

~/Library/Entwickler/Xcode/DerivedData /

enter image description here

9
ylgwhyh

Bei der Aktualisierung auf Xcode 7.1 wird diese Art von Fehler möglicherweise angezeigt und kann von keiner der obigen Antworten behoben werden. Eines der Symptome in meinem Fall war, dass die App auf dem Gerät und nicht im Simulator ausgeführt wird. Sie werden wahrscheinlich eine Vielzahl von Fehlern sehen, die sich auf so ziemlich alle von Ihnen verwendeten Frameworks beziehen.

Das Update ist eigentlich ganz einfach. Sie müssen lediglich einen Eintrag aus der "Framework Search Paths" -Einstellung löschen, die sich im Abschnitt TARGETS> Build Settings> Search Paths befindet (stellen Sie sicher, dass die Registerkarte "All" ausgewählt ist).

 enter image description here

Wenn hier (außer $ (geerbt)) ein anderer Eintrag für Ihre Hauptziele oder Ihr Testziel angezeigt wird, löschen Sie einfach den fehlerhaften Pfad von allen Zielen und erstellen Sie ihn neu.

5
whyoz

Ich habe festgestellt, dass dies auch passieren kann, wenn Sie einen Ordner mit Objective-C-Dateien in Ihr Projekt ziehen. Wenn dieser Ordner blau erscheint, weist er darauf hin, dass er nicht richtig verlinkt 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 Sie nach dem Hinzufügen eines Ordners die pbxproj-Datei nicht geändert haben (und daher ein Verknüpfungsfehler vorliegt). Sie werden also automatisch arbeiten und finden die von Ihnen importierten Klassen. Wenn das Image jedoch tatsächlich erstellt wird, schlägt der Fehlercode fehl.

Die Lösung besteht darin, den Ordner nicht hinzuzufügen, sondern die Dateien hinzuzufügen. Tun Sie dies und Sie sollten das Update der pbxproj-Datei sehen und es sollte diesen Fehler beheben.

Dies setzt auch voraus, dass Sie das getan haben, was oben vorgeschlagen wurde, und alle richtigen Frameworks ordnungsgemäß verknüpft haben.

4
Aggressor

Ich habe hier fast alles ausprobiert, aber mein Problem stellte sich als Überbleibsel eines vorherigen Kokosapods heraus. 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. Wiederaufbau
3
lonesomewhistle

Ich hatte den gleichen Fehler, da ich statt einer Datei einfach Verweise darauf entfernte. Es war hilfreich, die Datei im Finder zu suchen und zu entfernen.

3
Alatoo

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

1
jeffreysuej

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

Habe es aber durch einstellungsoption behoben:

Project -> Architecture -> Build Active Architecture Only

zu ja

und Projekt kompiliert und baut ordnungsgemäß

1
Raphael

Wenn Sie diese Fehlermeldung erhalten, wenn Sie versuchen, eine Verknüpfung zu einer C-Datei herzustellen, überprüfen Sie zunächst die Funktionsnamen auf Tippfehler. Überprüfen Sie als nächstes, dass Sie nicht versuchen, eine C-Funktion aus einer C++/Objective-C++ - Umgebung aufzurufen, ohne das Konstrukt extern C {} zu verwenden. Ich riss mir die Haare aus, weil ich eine Klasse hatte, die sich in einer .mm-Datei befand, die versuchte, C-Funktionen aufzurufen. Es funktioniert nicht, weil in C++ die Symbole entstellt sind. Sie können tatsächlich die konkreten Symbole sehen, die mit dem nm-Werkzeug erstellt wurden. Terminal an den Pfad der .o-Dateien, und führen Sie nm -g für die Datei aus, die das Symbol aufruft, und die, die das Symbol enthalten sollte, und Sie sollten prüfen, ob sie übereinstimmen oder nicht. Dies kann Hinweise auf den Fehler geben.

nm -g file.o

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

nm -gC file.o
1
james_alvarez

Ich habe dieses Problem oft konfrontiert. Dies geschieht normalerweise, wenn Sie Ihren Erstellungsordner löschen.

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

pod deintegrate
pod install
0
Anirudha Mahale

in meinem Fall Auswahl aufheben der Zielmitgliedschaft und dann erneut auswählen das Problem beheben.

Überprüfen Sie die Antwort von William Cerniuk mit dem beigefügten Foto.

0
user1105951

Für mich begann das nach dem Verschmelzungskonflikt.

Ich habe versucht, den Build-Ordner zu säubern und zu entfernen, aber es half nichts. Dieses Problem ist immer wieder aufgetreten. Dann habe ich den Verweis erneut verlinkt, indem ich die problematischen Gruppen gelöscht und dem Projekt wieder hinzugefügt habe, und es hat funktioniert.

0
green0range

in meinem Fall musste ich hinzufügen 

    target 'SomeTargetTests' do
        inherit! :search_paths
    end

(Xcode 10.1)

0
Brooks DuBois

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

0

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 sources und fügte die neue VC.m-Datei hinzu, die ich gerade hinzugefügt hatte. 

Ich arbeite mit altem Code und normalerweise bin ich ein schneller, neu in OBJ-C. Ich habe nicht daran gedacht, meine .m-Dateien in eine Quellbibliothek zu importieren. 

0
valeriana

Könnte auch ein #include <windows.h> in der .c-Datei sein, die Sie zu kompilieren versuchen.

0

Manchmal vergesse ich, die Bibliothek von Release-universal zu kopieren und versehentlich 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.

0

Ich bin zu spät zur Party gekommen, dachte aber daran, ein weiteres Szenario mitzuteilen, in dem dies passieren könnte. Ich arbeitete an einem Framework und verteilte es über Cocoapods baute erfolgreich . Bei der Verwendung von Pods in einem anderen Framework oder Projekt gab es diesen Fehler, da ich vergaß, .m-Dateien in podspec ..__ einzuschließen unten: s.source_files = "Projektname/Projektname/**/*. {Swift, h, m}"

Ich hoffe, es spart Zeit für andere.

0
Pranav Gupta