2012-12-18 78 views
11

我們創建了許多使用我們通信庫的MATLAB MEX文件。這個通信庫使用Boost很多。現在,MATLAB也在內部使用boost,這意味着在標準設置中,我們不能使用與MATLAB自帶的版本不同的增強版本或者全部都是隨之而來的版本。在MATLAB MEX庫中使用boost,與MATLAB的版本不同

問題是,我們參考版本的matlab(boost 1.40)附帶的boost版本相當陳舊,並且有一些bug。我們非常想使用更新的版本。

我看到的唯一解決方案是創建一個定製版本的boost,它位於不同的命名空間中。這個名稱應該防止命名衝突。這個解決方案有點棘手,因爲boost還會導出一些「C」符號,並且有一些宏需要改變。

是否有任何推薦的解決方案不需要創建自定義增強版本?

+0

您是否嘗試用'-l'選項指定Boost庫的完整路徑? –

+0

爲什麼會這樣?無論如何,我會在明天嘗試它,只是好奇。 – Ives

+0

也許這樣它可以連接你的Boost庫而不是MATLAB的。 –

回答

9

一種解決方案是改變MATLAB打開插件的方式,通過寫這本身對提升不依賴一個小型裝載機MEX文件,稱它爲foo.mexglx

它mexFunction調用只是做到這一點

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

其中gMexEntry變量的函數指針聲明爲

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

和當模塊加載時由靜態構造函數填充(爲簡潔起見,忽略所有錯誤檢查)。

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

的一連串事件是,當Matlab的調用你的函數,薄的包裝,沒有提升的依賴將打開你的功能與使用RTLD_DEEPBIND選項的dlopen的,這將會把查找範圍升壓依賴(使用Matlab的舊版本),在全局範圍之前,使用這個庫中的符號(使用你的boost版本)。然後,實際的mexFunction調用將轉發到bar。

如果你做你的CMDLINE連接正確,使用「LDD」你應該看到,「foo.mexglx」對升壓沒有依賴性,以及「bar.mexglx」有你所有常用的依賴。

我一直在大量使用這種技術幾個月沒有明顯的失敗跡象。我仍然有一些我不明白的東西可能會出錯,但目前這是我唯一的解決方案(除了編寫一個完整的進程外執行引擎來複制mxArray接口和與管道溝通,或者靜態鏈接一切,這對我的情況並不實際)

+2

假設您正在安裝其他mex庫以加載與_foo.mexglx_相同的位置,建議在構建_foo.mexglx_時將'-Wl,-rpath -Wl,$ ORIGIN'添加到鏈接器標誌,以便您不要當試圖通過'dlopen'加載庫時,需要使用'LD_LIBRARY_PATH'等。 – eric