2015-07-25 5 views
8

Sto cercando di utilizzare la libreria RFDuino Objective-C in Swift. Sembra tutto semplice, ho chiamato Objective-C dalle classi Swift prima, nessun problema. Questa volta però ho colpito il muro di mattoni.Chiamare Objective-C dalla classe Swift causando errori del linker

File di intestazione creato. Aggiunti i file di intestazione ad esso. Swift può vedere le classi senza problemi. Il progetto si compila bene.

Il problema durante la costruzione appare subito dopo provo a chiamare qualsiasi di classi Objective

ad esempio:

override func viewDidLoad() { 
     super.viewDidLoad() 

     let rfDuinoManager: RFduinoManager = RFduinoManager.sharedRFduinoManager() 

} 

Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_RFduinoManager", referenced from: __TMaCSo14RFduinoManager in ViewController.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

enter image description here

non sono sicuro che cosa Im manca qui. Link al progetto qui. https://www.dropbox.com/s/rza1ce01g4q5lp6/SmartHomeHub-stackoverflow.zip?dl=0

Grazie in anticipo per l'aiuto. Onestamente perdere la speranza ora e considerando di riscrivere tutta la libreria su Swift

risposta

14

Il problema è come la cartella rfduino è stato aggiunto al progetto. Così

  1. Rimuovi filtro rfduino (selezionando la cartella rfduino nel pannello di navigazione di progetto sulla sinistra e ha colpito il tasto cancellare, ma quando si chiede di spostarlo nel cestino o semplicemente rimuovere i riferimenti, scegliere "rimuovere i riferimenti".

    enter image description here

  2. l'intestazione ponte ha un riferimento percorso assoluto, io suggerirei di rimuovere che complessivamente selezionandola in impostazioni di generazione e di colpire il tasto delete:

  3. Ri-aggiungere nuovamente i file rfduino al progetto, questa volta, sotto l'opzione "cartelle aggiunte", scegliere "crea gruppi" anziché "crea riferimenti cartella". Se si vuole che chiede di creare una corretta intestazione di bridging per voi, non selezionare la cartella, ma selezionare i singoli file:

    enter image description here

    anche assicurarsi che sia selezionata SmartHomeHub di seguito.

  4. Se non che correttamente ti verrà chiesto di creare colmare intestazione automaticamente:

    enter image description here

  5. Vai a questa nuova intestazione di bridging e aggiungere nuovamente le linee di importazione:

    enter image description here

+0

Wow fantastico e molto dettagliato :) Grazie –

4

Questo è un errore del linker, non un errore del compilatore. Sei sicuro che la classe RFduino (sorgente o libreria) sia inclusa nel tuo progetto (apri il pannello di adesione al progetto a destra in Xcode e assicurati che la casella sia selezionata per includere la libreria nel tuo target).

Se è incluso, assicurarsi che sia stato compilato il codice x86_64. Potrebbe essere una libreria iOS ed è appena compilato per ARM. È possibile controllare trovando il file binario e eseguendo lipo su di esso dalla riga di comando.

lipo -info [name of RFduinolibrary.a(dylib,whatever)]

dovrebbe mostrare x86_64 come un'architettura, ala:

Architectures in the file are: i386 x86_64

+0

Grazie, così è stato! Ho importato tutta la cartella libarry. Ho controllato se la cartella è inclusa ma non ho controllato i file! Grazie –

0

enter image description here "L'obiettivo OPN [Debug] ha annullato es l'impostazione di generazione OTHER_LDFLAGS ". Questo era il problema principale. Dopo aver aggiunto $ (ereditato) in una nuova riga in altri flag di linker, ho risolto il problema.