2012-12-18 69 views
11

Chúng tôi đang tạo một số tệp MATLAB MEX sử dụng thư viện liên lạc của chúng tôi. Thư viện liên lạc này sử dụng Boost rất nhiều. Bây giờ, MATLAB cũng sử dụng tăng nội bộ, có nghĩa là trong một thiết lập tiêu chuẩn, chúng tôi không thể sử dụng một phiên bản tăng khác với phiên bản đi kèm với MATLAB hoặc tất cả các địa ngục sau đó.Sử dụng tăng trong thư viện MATLAB MEX, khác với phiên bản MATLAB

Vấn đề là phiên bản tăng cường đi kèm với phiên bản MATLAB tham chiếu của chúng tôi (tăng 1,40) khá cũ và có một vài lỗi. Chúng tôi rất muốn sử dụng phiên bản mới hơn.

Giải pháp duy nhất tôi thấy là tạo phiên bản tăng tùy chỉnh sống trong một không gian tên khác. Tên mangling sau đó nên ngăn chặn xung đột đặt tên. Giải pháp này là một chút khó khăn bởi vì thúc đẩy cũng xuất khẩu một số "C" biểu tượng và có một số vĩ mô mà tất cả sẽ cần phải được thay đổi.

Có bất kỳ giải pháp được đề xuất nào không yêu cầu tạo phiên bản tăng tùy chỉnh không?

+0

Bạn đã thử xác định đường dẫn đầy đủ của thư viện Boost bằng tùy chọn '-l' chưa? –

+0

Tại sao điều đó lại quan trọng? Tôi sẽ thử nó vào ngày mai dù sao đi nữa, chỉ tò mò thôi. – Ives

+0

có thể theo cách này nó có thể liên kết với thư viện Boost của bạn thay vì MATLAB. –

Trả lời

9

Một giải pháp là thay đổi cách matlab mở plugin của bạn, bằng cách viết một tập tin mex loader nhỏ mà bản thân nó không có sự phụ thuộc vào tăng, gọi nó là foo.mexglx

Nó gọi mexFunction chỉ đơn giản là không

này
void mexFunction (int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) 
{ 
    gMexEntry (nlhs, plhs, nrhs, prhs); 
} 

nơi biến gMexEntry được một con trỏ hàm khai báo là

typedef void (*entryfunc_t)(int, mxArray**, int, const mxArray**); 
entryfunc_t gMexEntry; 

và được điền bởi một hàm dựng tĩnh khi module được tải (tất cả các kiểm tra lỗi được bỏ qua cho ngắn gọn).

fh = dlopen ('bar.mexglx', RTLD_NOW | RTLD_DEEPBIND); 
void * p = dlsym (fh, "mexFunction"); 
gMexEntry = reinterpret_cast<entryfunc_t> (p); 

Các chuỗi sự kiện là khi Matlab gọi chức năng của bạn, bao bọc mỏng không có sự phụ thuộc tăng sẽ mở ra chức năng của bạn với các phụ thuộc tăng sử dụng RTLD_DEEPBIND tùy chọn dlopen, mà sẽ diễn ra phạm vi tra cứu các biểu tượng trong thư viện này (sử dụng phiên bản tăng của bạn) trước phạm vi toàn cầu (sử dụng tăng cũ của Matlab). Sau đó, cuộc gọi mexFunction thực tế sẽ chuyển tiếp đến thanh.

Nếu bạn làm cmdline của bạn liên kết một cách chính xác, sử dụng 'ldd' bạn sẽ thấy rằng 'foo.mexglx' không có sự phụ thuộc vào tăng, và 'bar.mexglx' có tất cả phụ thuộc thông thường của bạn.

Tôi đã sử dụng kỹ thuật này rất nhiều trong nhiều tháng mà không có dấu hiệu thất bại rõ ràng. Tôi vẫn có một số mối quan tâm nhỏ mà một cái gì đó tôi không hiểu có thể đi sai, nhưng đối với thời gian này là giải pháp duy nhất tôi đã có (khác hơn là viết một động cơ thực thi out-of-process sao chép giao diện mxArray và liên lạc với đường ống, hoặc liên kết mọi thứ tĩnh mà không thực tế cho tình huống của tôi)

+2

Giả sử bạn đang cài đặt các thư viện mex khác để tải trong cùng một vị trí như _foo.mexglx_, tôi đề nghị thêm '-Wl, -rpath -Wl, $ ORIGIN' vào cờ liên kết cờ khi xây dựng _foo.mexglx_ để bạn không cần phải muck với 'LD_LIBRARY_PATH', v.v. khi cố tải thư viện thông qua' dlopen'. – eric

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