2

我正在尝试从 Matlab 编译 C 共享库。我的 Matlab 代码使用了很多图像处理功能。所以,编译很顺利,但是当我从我的应用程序调用 dll 时,我收到如下消息:

“双精度类型输入参数的未定义函数或方法‘XYZ’”。

我已经验证我的论点没问题——这不是类型问题。所以,我尝试添加%#function XYZ到我的 .m 文件中,但这没有任何帮助。然后,我尝试-a在编译命令中使用该标志:

eval(['mcc -v -N -W lib:cshared -d ' clibdir ' -T link:lib -a edge' allFiles]); 

但它无法编译:

Depfun 错误:“无法将边缘定位为 MATLAB 路径上的函数”

我已经验证了图像处理文件在我的计算机上(我可以毫无问题地从 matlab 运行所有内容)并且我的路径指向包含它们的目录。

我还尝试将工具箱 .m 文件复制到我的工作目录中,但这很快就会膨胀成很多文件。而且,对于某些功能,没有 .m - 只有一个 .mex - 我还没有找到将 mex 文件包含到我的 .dll 中的方法。

我错过了什么?

4

1 回答 1

3

您是否尝试过使用该-a选项包含图像处理工具箱文件夹?例如:

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images

根据mcc文档,此文件夹中的所有文件以及任何子文件夹中的所有文件都将添加到 CTF 存档中,并且文件夹子树保留在 CTF 存档中。

如果您不想包含每个子文件夹,则可以使用通配符模式仅加载文件夹中的文件:

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images\*

如果有一个子文件夹可能具有可能隐藏父文件夹中的功能或脚本,则这可能是必要的。例如,edge.m父文件夹中有一个函数C:\Program Files\MATLAB\R2009a\toolbox\images\images\,还有一个ja包含日语帮助文件的子文件夹(在 Windows 上),其中一个也称为edge.m. 您不希望在编译时添加此子文件夹,因此您可以:

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

  2. 使用通配符选项添加父文件夹(仅添加文件),然后使用附加命令单独添加您想要的子文件夹(例如@strel和)。注意:我不确定单独添加子文件夹是否会以与选项 #1 相同的方式维护 CTF 存档中父目录的文件夹子树!private-a

如果您不想包含大量可能最终不会被使用的文件,您可以尝试使用函数DEPFUN首先获取 MATLAB 代码的依赖项列表。然后从这个列表中,您可以找到您的代码使用的特定图像处理工具箱函数,并且仅在编译时包含这些函数。由于您特别询问,此新闻组线程提到了如何包含 .mex 文件:

mcc ... -a imreconstructmex.mexw32  %# For a 32-bit Windows mex file


注意:我还遇到了一个MathWorks 错误报告(您需要登录才能查看),其中提到在 R2009b 中使用 Windows 上的某些图像处理工具箱函数编译应用程序时出现问题。上面的链接给出了一种解决方法。自 R2010a 起,此错误已修复。

于 2010-09-27T14:56:46.377 回答