我有一个带有特定函数的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加载mex文件及其库的方式有关吗?
答案 0 :(得分:1)
Boost为此问题提供了解决方法;见https://svn.boost.org/trac/boost/ticket/754
升压可能无法启用变通方法。尝试按照该票证上的补丁传递编译器标志-DBOOST_AUX_ANY_TYPE_ID_NAME
。