matlab - 使用图像处理工具箱编译Matlab共享库

标签 matlab matlab-deployment matlab-compiler

我正在尝试从 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。您不希望在编译时添加此子文件夹,因此您可以:

  1. 暂时删除该子文件夹,添加不带通配符选项的父文件夹(以添加您确实需要的其他子文件夹),然后放回该文件夹。

  2. 使用通配符选项添加父文件夹(仅添加文件),然后仅单独添加所需的子文件夹(例如 @strelprivate) 加上一个额外的 -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/

相关文章:

c# - 错误 : 'Subscript indices must either be real positive integers or logicals' when using Matlab . NET 生成器

python - 'matlab.object' 对象无法使用 matlab 引擎调用

java - Matlab openfig headless 显示器

c++ - ndgrid matlab函数的工作原理

java - 在 Java 中使用 Matlab 项目

c++ - 在 C++ 中使用 Matlab 数据结构?

MATLAB 引擎 : engEvalString() won't return if given incomplete input

matlab - 对具有未知标签的数据进行分类并在 matlab 中验证结果

具有不同整数长度的正则表达式

matlab - 将 excel 图表导出为图片(通过自动化)