我当然希望你的底层 mex 编译器是 gcc / GNU binutils。如果没有,您可能需要更改 mex 编译器,以便它是。这个答案非常特定于 GNU ld...
将以下内容添加到使用 mexFunction 编译的代码中:
void *
__wrap_malloc(size_t size)
{
return mxMalloc(size);
}
void
__wrap_free(void *ptr)
{
return mxFree(ptr);
}
void *
__wrap_memalign(size_t alignment __attribute__((__unused__)), size_t size)
{
return mxMalloc(size);
}
顺便说一句,我通过执行 objdump -T libfftw3.so 并查找堆管理函数的 *UND* 条目来获得要包装的三个函数列表。只有他们三个出现了。
现在,将以下内容添加到您的 mex 命令行:
CLIBS='-Wl,--wrap=malloc,--wrap=free,--wrap=memalign,-Bstatic,-lfftw3,-Bdynamic $CLIBS'
通过强制链接器静态引入 libfftw3,它可以使用重定向到 MATLAB 的堆管理函数的自定义包装器来包装指定的堆调用。
如果你想花哨的话,你可以在 memalign() 包装器中手动强制对齐,并返回一个正确对齐的指针,但是你必须跟踪每个分配以在 free() 时间撤消指针更改.我只是天真地假设 MATLAB 的分配器将返回已经为零模最大有用对齐的指针,认为 MATLAB 对此的需求类似于 FFTW。
另外,请记住在退出 mexFunction 的过程中销毁所有计划和 fftw_cleanup()。 MATLAB 将在您的 mexFunction 返回时强制释放您的 mexFunction(或您的 mexFunction 调用的 FFTW)分配的任何内容,除非您明确地 mexMakeMemoryPersistent() 它。