gpt4 book ai didi

c++ - 在 MATLAB MEX 库中使用 boost,与 MATLAB 的版本不同

转载 作者:可可西里 更新时间:2023-11-01 15:20:20 28 4
gpt4 key购买 nike

我们正在创建大量使用我们的通信库的 MATLAB MEX 文件。这个通信库大量使用了 Boost。现在,MATLAB 还在内部使用 boost,这意味着在标准设置中,我们不能使用与 MATLAB 附带的版本不同的 boost 版本,否则一切都会接踵而至。

问题是,我们的 matlab 引用版本 (boost 1.40) 附带的 boost 版本很旧并且有一些错误。我们非常想使用更新的版本。

我看到的唯一解决方案是创建一个位于不同 namespace 中的自定义版本的 boost。名称重整应该可以防止命名冲突。这个解决方案有点棘手,因为 boost 还导出一些“C”符号并且有许多宏都需要更改。

是否有不需要创建自定义 boost 版本的推荐解决方案?

最佳答案

一个解决方案是通过编写一个本身不依赖于 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 依赖项的函数,这将放置此库中符号的查找范围(使用您的 boost 版本)先于全局范围(使用 Matlab 的旧 boost)。然后实际的 mexFunction 调用将转发给 bar。

如果您正确地执行 cmdline 链接,使用“ldd”,您应该看到“foo.mexglx”不依赖于 boost,而“bar.mexglx”具有您所有的常用依赖项。

几个月来我一直大量使用这种技术,没有明显的失败迹象。我仍然有点担心我不明白的东西可能会出错,但目前这是我唯一的解决方案(除了编写一个完整的进程外执行引擎来复制 mxArray 接口(interface)和与管道通信,或静态链接所有内容,这对我的情况不切实际)

关于c++ - 在 MATLAB MEX 库中使用 boost,与 MATLAB 的版本不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13934107/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com