2012-10-14 31 views
6

tôi đang làm việc trên một phần mở rộng C cho ruby, nhưng tôi cần phải bao gồm tiêu đề từ khuôn khổ IOBluetooth, cụ thể:Linking tiêu đề Cocoa để ruby ​​C mở rộng

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

Tất cả mọi thứ biên dịch tốt, nhưng khi chạy, phần mở rộng lỗi:

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

Tôi khá chắc chắn điều này có liên quan đến khung không được đưa vào quá trình liên kết nhưng tôi không chắc chắn lý do. Bất kỳ trợ giúp sẽ được đánh giá rất

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

tạo Makefile:http://paste.wilhall.com/25

UPDATE: Tôi đổi Makefile để thư viện tĩnh liên kết; vẫn gặp lỗi tương tự, nhưng lần này khi liên kết.

Thật kỳ lạ, have_header trong tệp extconf.rb của tôi tìm thấy các tệp tiêu đề này tốt.

UPDATE: Tôi đã kéo sau đây từ các tập tin hệ thống đăng nhập:

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 

Nếu tôi nhớ không lầm thì EXC_BAD_ACCESS (SIGABRT) thường liên quan đến một vấn đề GC? Sẽ xem xét và đăng kết quả

+0

đây là một câu hỏi tuyệt vời +1 –

Trả lời

1

Điều này có vẻ quá đơn giản, vì vậy tôi có thể tắt, nhưng có vẻ như ngay từ những gì bạn đã đăng. Có vẻ như vấn đề không phải là tiêu đề, nhưng bạn không liên kết chính khung IOBluetooth. Bạn có đang chỉ định bất cứ điều gì như -framework IOBluetooth ở bất kỳ đâu không?

+0

Tôi xin lỗi, MakeFile tôi đã đăng là một bản mới được tạo. Tôi chỉnh sửa nó để bao gồm 'IOBluetooth' như một khuôn khổ. Xem phần cuối của câu hỏi cho phần mới của lỗi – WilHall

1

Hãy chắc chắn rằng bạn đã bao gồm

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

Trong makefile của bạn. Hãy chắc chắn rằng bạn có khung trong thư mục bên phải. Nhưng nếu bạn có thể biên dịch nó, liên kết nó, IOBluetooth của bạn dường như bây giờ trong nhị phân của bạn.

Bằng cách bạn đang cố gắng truy cập một con trỏ tại địa chỉ 0x02, đây là những gì tạo ra sự cố. Tôi không chắc chắn nó liên quan đến IOBluetooth nữa

Các vấn đề liên quan