在matlab mex文件中动态链接时枚举的typeid更改

时间:2012-07-13 22:23:16

标签: c++ matlab boost mex typeid

我有一个带有特定函数的C ++库,它返回boost::any,其值类型是在不同的包含库中定义的特定enum。这通常很好。

但是当我从Matlab mex文件动态链接到我的库时,typeid(the_enum_t)似乎与我的库中的内容和调用者中的内容不同,因为它不会比较{{1} }}。由于我实际上使用flann,其版本==执行基于boost::any的检查,因此这会使一切都中断。静态链接工作正常,但这是一种痛苦,我真的宁愿让它工作。

我认为type_info::==应该跨库边界一致地工作。这与Matlab如何从mex动态加载库有关吗?


以下是一些重现此代码的代码(也可以在this gist中以易于下载的形式提供,带有makefile。)

首先,定义枚举(type_info::==)的库的替身:

flann

现在是我的图书馆的代理namespace library { enum the_enum_t { el_one, el_two, el_three }; }

stubby.hpp

及其实施#include <boost/any.hpp> #include "the_enum.hpp" boost::any the_function();

stubby.cpp

最后,测试代码#include "stubby.hpp" boost::any the_function() { return boost::any(library::el_two); } ,使用test.cpp编译为独立而不是mex文件:

-DNO_MEX

我得到了预期的输出

#include "stubby.hpp"
#include <boost/any.hpp>

#ifdef NO_MEX
#include <cstdio>
using std::printf;
int main() {
#else
#include "mex.h"
void mexFunction(int nlhs, mxArray **plhs, int nrhs, const mxArray **prsh) {
#endif
    boost::any val_any = the_function();
    printf("%s (equal: %d)\n",
            val_any.type().name(),
            val_any.type() == typeid(library::the_enum_t));
}

来自每个

N5flann17flann_algorithm_tE (equal: 1)

但动态链接mex文件不起作用:

$ g++ -o test{,.cpp} -DNO_MEX libstubby.a && ./test      
$ g++ -o test{_s,.cpp} -DNO_MEX libstubby.so && ./test_s
$ ln -sf test{,_s}.cpp && mex test_s.cpp libstubby.a && matlab -r test

我在

上看到了同样的行为
  • Matlab R2011b和R2011a,OSX 10.7,Apple gcc 4.2.1
  • Matlab R2011b,CentOS 5.7,gcc 4.1.2
  • Matlab R2010a,Ubuntu 11.04,gcc 4.4.5

奇怪的是,我可以在几个月前宣誓就职,但也许我的测试工作做得不好。

显然我可以通过静态链接解决这个问题。但为什么会这样呢?它与Matlab加载mex文件及其库的方式有关吗?

1 个答案:

答案 0 :(得分:1)

Boost为此问题提供了解决方法;见https://svn.boost.org/trac/boost/ticket/754

升压可能无法启用变通方法。尝试按照该票证上的补丁传递编译器标志-DBOOST_AUX_ANY_TYPE_ID_NAME