我正在尝试从 Matlab 编译 C 共享库。我的 Matlab 代码使用了很多图像处理功能。因此,编译顺利,但是当我从应用程序调用 dll 时,我收到如下消息:
"Undefined function or method 'XYZ' for input arguments of type double".
我已经验证了我的论点是正确的——这不是类型问题。因此,我尝试将 %#function XYZ
添加到我的 .m 文件中,但这没有任何帮助。然后,我尝试在编译命令中使用 -a
标志:
eval(['mcc -v -N -W lib:cshared -d ' clibdir ' -T link:lib -a edge' allFiles]);
但无法编译:
Depfun error: 'Unable to locate edge as a function on the MATLAB path'
我已经验证图像处理文件位于我的计算机上(我可以毫无问题地运行 matlab 中的所有内容),并且我的路径指向包含它们的目录。
我还尝试将工具箱 .m 文件复制到我的工作目录中,但很快就会变成很多文件。而且,对于某些函数,没有 .m - 只有 .mex - 而且我还没有找到将 mex 文件包含到我的 .dll 中的方法。
我错过了什么?
最佳答案
您是否尝试过使用 -a
选项包含图像处理工具箱文件夹?例如:
mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images
根据 mcc
documentation ,该文件夹中的所有文件以及任何子文件夹中的所有文件都将添加到 CTF 存档中,并且文件夹子树将保留在 CTF 存档中。
如果您不想包含每个子文件夹,可以使用通配符模式仅加载文件夹中的文件:
mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images\*
如果子文件夹中的函数或脚本可能会隐藏父文件夹中的函数或脚本,则这可能是必要的。例如,父文件夹C:\Program Files\MATLAB\R2009a\toolbox\images\images\
中有一个edge.m
函数,并且有一个ja
subfolder that contains Japanese language help files (在 Windows 上),其中之一也称为 edge.m
。您不希望在编译时添加此子文件夹,因此您可以:
暂时删除该子文件夹,添加不带通配符选项的父文件夹(以添加您确实需要的其他子文件夹),然后放回该文件夹。
使用通配符选项添加父文件夹(仅添加文件),然后仅单独添加所需的子文件夹(例如
@strel
和private
) 加上一个额外的-a
命令。 注意:我不确定单独添加子文件夹是否会像选项 #1 一样维护 CTF 存档中父目录的文件夹子树!
如果您不想包含最终可能不会使用的大量文件列表,则可以尝试使用函数 DEPFUN 首先获取 MATLAB 代码的依赖项列表。然后,从此列表中您可以找到您的代码使用的特定图像处理工具箱函数,并且仅包含编译时的函数。既然您特别询问,this newsgroup thread 提到了如何包含 .mex 文件:
mcc ... -a imreconstructmex.mexw32 %# For a 32-bit Windows mex file
注意: 我还遇到过一个 MathWorks bug report(需要登录才能看到),其中提到在 R2009b 的 Windows 上使用某些图像处理工具箱功能编译应用程序时出现问题。上面的链接给出了一个解决方法。此错误从 R2010a 开始已修复。
关于matlab - 使用图像处理工具箱编译Matlab共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3804585/