【问题标题】:Compiling Matlab shared library with image processing toolbox用图像处理工具箱编译Matlab共享库
【发布时间】:2011-04-17 19:16:31
【问题描述】:

我正在尝试从 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 中的方法。

我错过了什么?

【问题讨论】:

    标签: matlab matlab-deployment matlab-compiler


    【解决方案1】:

    您是否尝试过使用-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. 使用通配符选项添加父文件夹(仅添加文件),然后使用附加的-a 命令单独添加所需的子文件夹(例如@strelprivate)。 注意:我不确定单独添加子文件夹是否会像选项 #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 开始,此错误已修复。

    【讨论】:

    • 感谢您的回复...我想我现在更接近了。但是,现在我遇到了运行时错误,“尝试将脚本作为函数执行:c:\...\edge.m”。我猜是因为边缘是阴影的(它有一个 .m 和一个 .mex)。我有什么方法可以告诉 mcc 正确解决阴影函数吗?我猜 edge 不是唯一会遇到这个问题的。
    • @mike:在我的 MATLAB (R2009a) 版本中,我可以在文件夹“C:\Program Files\MATLAB\R2009a\toolbox\images\images”中看到一个函数“edge.m” .那里还有三个文件夹:“@strel”、“ja”和“private”。我没有找到“边缘”的 .mex 文件。我在其中找到另一个名为“edge”的文件的唯一文件夹是“ja”文件夹,它还有另一个“edge.m”,看起来不过是 cmets。我会尽快用一种可能的方法来更新我的答案。
    • 非常感谢新手。我仍在努力使用您的建议,但它看起来很有希望。我觉得这应该是一个环境问题,因为 ja 文件夹也存在于其他地方(例如,我需要的 toolbox/images/iptutils)。所以我可以看到我的编译命令变得非常失控,有这么多 -a 完整路径参数。更不用说,如果团队中的其他人去运行我的构建脚本,我宁愿他们不必处理不同的路径等。我在谷歌上根本没有发现这个问题似乎也很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多