2012-10-14 12 views
6

pracuję nad rozszerzeniem C dla Ruby, ale muszą zawierać nagłówki z ram IOBluetooth, a konkretnie:Łączenie nagłówki kakao ruby ​​c przedłużenie

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

Wszystko kompiluje poprawnie, ale przy starcie, rozszerzenie błędy:

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

Jestem całkiem pewien, że to ma coś wspólnego z ramami nie są wliczone w trakcie łączenia, ale nie jestem pewien dlaczego. Każda pomoc będzie mile widziana

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') 

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

UPDATE: I zmodyfikowane Makefile tak, że biblioteka statycznie linki; nadal występuje ten sam błąd, ale tym razem podczas łączenia.

Dziwnie, have_header w moim pliku extconf.rb znajduje te pliki nagłówka dobrze.

UPDATE: I wyciągnął następujący z logów systemu:

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 

Jeśli dobrze pamiętam, EXC_BAD_ACCESS (SIGABRT) jest często związana z emisji GC? Przyjrzymy się temu i opublikujemy wyniki:

+0

To jest niesamowite pytanie +1 –

Odpowiedz

1

Wydaje się to zbyt proste, więc mogę być wyłączony, ale wygląda na to, co napisałeś. Wygląda na to, że problemem nie są nagłówki, ale to, że nie łączysz samej struktury IOBluetooth. Czy w dowolnym miejscu określasz coś takiego jak -framework IOBluetooth?

+0

Przepraszam, MakeFile, który napisałem, jest świeżo wygenerowany. Zmodyfikowałem go tak, aby obejmował framework 'IOBluetooth'. Zobacz ostatnią część pytania dotyczącą nowej części błędu – WilHall

1

Upewnij się, że włączone

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

W swoim makefile. Upewnij się, że masz strukturę we właściwym katalogu. Ale jeśli możesz go skompilować, połączyć go, twój IOBluetooth wydaje się teraz w twoim binarnym.

Sposób, w jaki próbujesz uzyskać dostęp do wskaźnika pod adresem 0x02, właśnie to tworzy awarię. Nie jestem pewien, czy to już jest związane z IOBluetooth.