11

通信ライブラリを使用する多数の MATLAB MEX ファイルを作成しています。この通信ライブラリはBoostを多用しています。現在、MATLAB は内部でもブーストを使用しています。つまり、標準のセットアップでは、MATLAB に付属しているものとは異なるバージョンのブーストを使用することはできません。

問題は、参照バージョンの matlab (boost 1.40) に付属しているブースト バージョンがかなり古く、いくつかのバグがあることです。新しいバージョンを使用したいと考えています。

私が見る唯一の解決策は、別の名前空間にあるカスタム バージョンのブーストを作成することです。名前マングリングは、名前の競合を防ぐ必要があります。このソリューションは少しトリッキーです。なぜなら、boost はいくつかの "C" シンボルもエクスポートし、すべてを変更する必要がある多数のマクロを持っているからです。

カスタム ブースト バージョンの作成を必要としない、推奨されるソリューションはありますか?

4

1 に答える 1

9

解決策の 1 つは、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 が関数を呼び出すときに、ブースト依存関係のないシン ラッパーが、dlopen のRTLD_DEEPBINDオプションを使用してブースト依存関係で関数を開き、シンボルのルックアップ スコープをこのライブラリに配置することです (バージョンを使用)。ブーストの)グローバルスコープよりも先に(Matlabの古いブーストを使用)。次に、実際の mexFunction 呼び出しが bar に転送されます。

「ldd」を使用してコマンドライン リンクを正しく行うと、「foo.mexglx」にはブーストへの依存関係がなく、「bar.mexglx」にはすべての通常の依存関係があることがわかります。

私はこの手法を何ヶ月も頻繁に使用しており、明らかな失敗の兆候はありません. 理解できないことがうまくいかないのではないかというわずかな懸念はまだありますが、当面はこれが唯一の解決策です (mxArray インターフェイスを複製する完全なアウトプロセス実行エンジンを作成し、パイプとの通信、またはすべてを静的にリンクすることは私の状況では実用的ではありません)

于 2013-01-02T08:48:25.687 に答える