在MATLAB MEX库中使用boost,与MATLAB的版本不同
我们创建了许多使用我们通信库的MATLAB MEX文件。这个通信库使用Boost很多。现在,MATLAB也在内部使用boost,这意味着在标准设置中,我们不能使用与MATLAB自带的版本不同的增强版本或者全部都是随之而来的版本。在MATLAB MEX库中使用boost,与MATLAB的版本不同
问题是,我们参考版本的matlab(boost 1.40)附带的boost版本相当陈旧,并且有一些bug。我们非常想使用更新的版本。
我看到的唯一解决方案是创建一个定制版本的boost,它位于不同的命名空间中。这个名称应该防止命名冲突。这个解决方案有点棘手,因为boost还会导出一些“C”符号,并且有一些宏需要改变。
是否有任何推荐的解决方案不需要创建自定义增强版本?
一种解决方案是改变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接口和与管道沟通,或者静态链接一切,这对我的情况并不实际)
假设您正在安装其他mex库以加载与_foo.mexglx_相同的位置,建议在构建_foo.mexglx_时将'-Wl,-rpath -Wl,$ ORIGIN'添加到链接器标志,以便您不要当试图通过'dlopen'加载库时,需要使用'LD_LIBRARY_PATH'等。 – eric
您是否尝试用'-l'选项指定Boost库的完整路径? –
为什么会这样?无论如何,我会在明天尝试它,只是好奇。 – Ives
也许这样它可以连接你的Boost库而不是MATLAB的。 –