簡體   English   中英

在MATLAB MEX庫中使用boost,與MATLAB的版本不同

[英]Using boost in MATLAB MEX library, different from MATLAB's version

我們正在創建許多使用我們的通信庫的MATLAB MEX文件。 這個通信庫經常使用Boost。 現在,MATLAB也在內部使用boost,這意味着在標准設置中,我們不能使用不同於MATLAB附帶的升級版本或隨后的所有地獄。

問題是,我們的參考版本的matlab(boost 1.40)附帶的boost版本已經很老了,並且有一些bug。 我們非常想使用更新的版本。

我看到的唯一解決方案是創建一個生活在不同命名空間中的自定義版本的boost。 然后,名稱修改應該防止命名沖突。 這個解決方案有點棘手,因為boost還會導出一些“C”符號並且有許多宏都需要更改。

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

一個解決方案是改變matlab打開插件的方式,通過編寫一個小的加載器mex文件,它本身不依賴於boost,稱之為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調用你的函數時,沒有boost依賴的瘦包裝器將使用dlopen的RTLD_DEEPBIND選項打開你的函數和boost依賴, 這將把符號的查找范圍放在這個庫中(使用你的版本)提升)在全球范圍之前 (使用Matlab的舊推動)。 然后實際的mexFunction調用將轉發到bar。

如果你正確地使用'ldd'進行cmdline連接,你應該看到' foo.mexglx '不依賴於boost,' bar.mexglx '擁有你所有常用的依賴關系。

幾個月來我一直在使用這種技術,沒有明顯的失敗跡象。 我仍然有一些輕微的擔憂,我不明白的東西可能會出錯,但暫時這是我得到的唯一解決方案(除了編寫一個完整的進程外執行引擎復制mxArray接口和與管道通信,或靜態鏈接所有對我的情況不切實際的事情)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM