一種解決方案是改變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接口和與管道溝通,或者靜態鏈接一切,這對我的情況並不實際)
您是否嘗試用'-l'選項指定Boost庫的完整路徑? –
爲什麼會這樣?無論如何,我會在明天嘗試它,只是好奇。 – Ives
也許這樣它可以連接你的Boost庫而不是MATLAB的。 –