2012-10-14 19 views
6

Sto lavorando su un'estensione C per Ruby, ma ho bisogno di includere le intestazioni dal quadro IOBluetooth, in particolare:Collegamento intestazioni di cacao al rubino C estensione

#import <IOBluetooth/objc/IOBluetoothDeviceInquiry.h> 
#import <IOBluetooth/IOBluetoothUserLib.h> 

tutto compila bene, ma in fase di esecuzione, l'estensione errori:

path/to/file.rb:1:in `require_relative': dlopen(/path/to/extension.bundle, 9): 
Symbol not found: _OBJC_CLASS_$_IOBluetoothDeviceInquiry (LoadError) 

sono abbastanza sicuro che questo ha qualcosa a che fare con il quadro non essere inclusi nel processo di collegamento, ma non sono sicuro perché. Qualsiasi aiuto sarebbe molto apprezzato

extconf.rb:

# Loads mkmf which is used to make makefiles for Ruby extensions 
require 'mkmf' 

# Give it a name 
extension_name = 'bluetooth' 

dir_config(extension_name) 

create_makefile(extension_name, 'bluetooth') 

MakeFile Generated:http://paste.wilhall.com/25

UPDATE: ho modificato il Makefile in modo che la biblioteca collega in modo statico; ancora sperimentando lo stesso errore, ma questa volta durante il collegamento.

Stranamente, have_header nel mio file extconf.rb trova questi file di intestazione fini.

UPDATE: Ho tirato il seguente dai file di registro del sistema:

Process:   ruby [951] 
Path:   /usr/local/bin/ruby 
Identifier:  ruby 
Version:   0 
Code Type:  X86-64 (Native) 
Parent Process: bash [468] 
User ID:   501 

Date/Time:  2012-10-17 14:06:57.425 -0400 
OS Version:  Mac OS X 10.8.1 (12B19) 
Report Version: 10 

Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Exception Type: EXC_BAD_ACCESS (SIGABRT) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000010 

Se non ricordo male, EXC_BAD_ACCESS (SIGABRT) è spesso legato ad un problema di GC? Lo esamineremo e pubblicheremo i risultati

+0

questa è una domanda fantastica +1 –

risposta

1

Questo sembra troppo semplice, quindi potrei essere fuori, ma sembra proprio da quello che hai postato. Sembra che il problema non siano le intestazioni, ma che tu non stia collegando il framework IOBluetooth stesso. Stai specificando qualcosa come -framework IOBluetooth ovunque?

+0

Mi scuso, il MakeFile che ho postato è appena generato. L'ho modificato per includere 'IOBluetooth' come framework. Vedi l'ultima parte della domanda per la nuova parte dell'errore – WilHall

1

Assicurarsi di incluso

-framework Foundation System/Library/Frameworks/IOBluetooth.framework/IOBluetooth 

nel makefile. Assicurati di avere il framework nella giusta directory. Ma se riesci a compilarlo, collegalo, il tuo IOBluetooth sembra ora nel tuo binario.

Dal modo in cui si sta tentando di accedere a un puntatore all'indirizzo 0x02, questo è ciò che crea l'arresto anomalo. Non sono sicuro che sia collegato a IOBluetooth più