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.
quelle
$(inherited)
, andere Linker-Flags hinzuzufügen , zu bereinigen und zu erstellen.Antworten:
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.
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):
quelle
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.
quelle
Valid Architectures
und abdecktArchitectures
.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!!
quelle
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).
quelle
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:
quelle
In meinem Fall war es keine Bibliothek, es waren einige Klassen.
Lösung Ich hatte mehrere Ziele in Xcode mit mehreren Schemas (Produktion, Entwicklung usw.). Einige meiner neu hinzugefügten Implementierungen (Class.m) fehlten in
Also musste ich sie manuell hinzufügen.
dann konnte ich erfolgreich kompilieren und bauen.
quelle
Ich habe auch das gleiche Problem festgestellt, die oben genannten Methoden werden nicht funktionieren. Ich habe versehentlich die Dateien im folgenden Verzeichnis gelöscht.
Oder
~ / Library / Developer / Xcode / DerivedData /
quelle
~/Library/Developer/Xcode/DerivedData/
Über die CLI können Sie das Verzeichnis wie folgtrm -rf ~/Library/Developer/Xcode/DerivedData/
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).
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.
quelle
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.
quelle
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:
rm -Rf Pods; pod install
quelle
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.
quelle
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:
zu Ja
und das Projekt wird ordnungsgemäß kompiliert und erstellt
quelle
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.
quelle
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 Sienm -g
die 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.Sie können die damit entwirrten C ++ - Symbole überprüfen:
quelle
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.
quelle
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.
quelle
Ich habe es gelöst, indem ich "-lc ++" in "Andere Linker-Flags" in den Build-Einstellungen hinzugefügt habe.
quelle
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.
quelle
Könnte auch eine
#include <windows.h>
in der .c-Datei sein, die Sie kompilieren möchten.quelle
in meinem Fall musste ich hinzufügen
in meine Poddatei und lösche dann das Verzeichnis / Pods und führe `pod install` aus(Xcode 10.1)
quelle
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 neueVC.m
Datei 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
.m
Dateien 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.
Alles in allem ist dies ein sehr vager Fehlercode, der aus vielen Gründen verursacht werden kann. Probieren Sie also weiterhin verschiedene Optionen aus.
quelle
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.
quelle
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.
quelle
In meinem Fall war das Problem die kompilierte Framework-Architektur.
Ich verwende Xcode 11 und verwende Swift 5.1
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.
quelle