解決策の 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 インターフェイスを複製する完全なアウトプロセス実行エンジンを作成し、パイプとの通信、またはすべてを静的にリンクすることは私の状況では実用的ではありません)