一种解决方案是通过编写一个本身不依赖于 boost 的小型加载程序 mex 文件来更改 matlab 打开插件的方式,称之为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。
如果您正确执行 cmdline 链接,使用 'ldd' 您应该会看到 ' foo.mexglx ' 不依赖于 boost,而 ' bar.mexglx ' 具有所有通常的依赖关系。
几个月来我一直在大量使用这种技术,没有明显的失败迹象。我仍然有点担心我不明白的事情可能会出错,但目前这是我唯一的解决方案(除了编写一个完整的进程外执行引擎来复制 mxArray 接口和与管道通信,或静态链接所有内容,这对我的情况不实用)