matlab笔记:MEX文件函数使用中的问题

之前在matlab笔记:安装MinGW编译器一文中已经介绍过,MEX文件函数是Matlab提供的一种混合编程方式。通过MEX,用户可以在matlab中调用C、C++(没有C#,但我想提一下其实C#的真正含义是C++++,因为#其实就是四个+)或者Fortran编写的计算程序,加速matlab内部的矩阵运算(尤其是加速matlab代码中的for循环)。mex本质上是一个动态链接库文件(dll),可以被matlab动态加载并执行。然而在使用的过程中,我又碰到了许多问题。

References

电子文献:
https://ww2.mathworks.cn/help/matlab/call-mex-file-functions.html
https://blog.csdn.net/hijack00/article/details/52228253
https://jingyan.baidu.com/article/3a2f7c2ea00a9c66aed61163.html


安装版本适配的MinGW编译器

根据之前文章中写的配置方法,在编译MEX的时候,虽然没有问题,但是却出现了警告:使用的是不受支持的MinGW编译器版本。
于是我先查看了当前使用的编译器的版本。方法如下:

  1. 在MinGW-w64编译器的安装目录中,找到gcc.exe可执行文件的存在位置。
  2. 打开命令行,切换到刚刚找到的gcc.exe文件所在的目录。
  3. 键入gcc -v即可查看当前编译器的版本。

这时我使用的是5.1.0版本,于是我又到mathworks的网站上看了一下各个matlab版本适配的编译器版本。

这里我把图片截过来了,就不用去找了。我使用的是matlab R2019a,因此适配的是MinGW GCC 6.3(似乎高一点或者低一点都不行)。
于是我根据它所提供的SourceForge网址去找新版本的安装包,下载解压之后是一个不含任何可执行文件(exe)的文件夹,而且是7.0.0版本的,无法自主地选择。
寻找良久之后,我终于发现了一个在线安装文件,也建议下载这个,因为后面需要选择特定版本来安装。

下载完成后直接双击安装,这里会有一个安装设置界面。这个要注意一下,别点过去了。版本号一定要设置成对应的,比如我是6.3.0;另外,由于安装在windows 64位系统上,所以选择x86_64以及win32;至于其它的选项可以任选,一般默认就好了。

之后就是一路“下一步”,记得记住安装路径。
之后就是用和matlab笔记:安装MinGW编译器中所写的相同的方式添加环境变量。可以直接把之前已有的MW_MINGW64_LOC的值替换成刚刚记下的路径,最后别忘了在matlab中setenv
这时也可以把之前的编译器删了,如果是TDM-GCC的话那很方便,直接在它的一个管理界面中uninstall就行了,另外还会剩下一个空文件夹,手动删除就行。


连接外部库

在我使用的过程中,我还遇到了如下ERROR: Unable to compile MEX function: “MEX 找不到使用 -l 选项指定的库 ‘ut’。

上网搜了一下后,我才知道MEX命令可以用-L选项指定第三方库的路径,用-l来连接第三方库文件。值得注意的是,这里使用的是该库文件的文件名,不包含其文件扩展名。其基本格式如下:

1
mex -L<library_path> -l<library>

可以发现,-L<library_path>-l<library>之间是没有加空格的。
可是看了这些,我还是解决不了我的问题。
这里说一下我出现这个问题的背景,最近接触计算机视觉中的目标跟踪这一块,正在学习vot-toolkit的使用。
我既问了度娘又问了谷哥,可是没有看到任何这个问题及其解决方法。于是我缩小范围,看了看Github上vot-toolkit的issues和VOT Challenge technical support的Google groups,惊喜的是的确都找到了同样的问题。


然而都只有问题没有解答。无奈,还是自己想办法吧。
其实跟着报错的提示来修改并不难,关键是要找到该修改哪里。
由于报错提示的函数中根本没有MEX连接库文件的指令(我一行一行代码找的),于是我想能不能找到MEX的编译文件。最终我在vot-toolkit-master\utilities中找到了一个名为compile_mex.m的matlab文件,其中有这样的一串代码。

1
2
3
4
5
if is_octave()
arguments{end+1} = '-DOCTAVE';
else
arguments{end+1} = '-lut';
end

我用的是matlab,不是octave(后者相当于轻量级的免费matlab,语法什么的基本一致),那么执行的应该是else后面的语句,而在这里可以看到调用ut的命令。
于是我就把这里的-lut改成了-Lut试了一下,果然成功了。
其实用有搜索功能的IDE的话或许能够更快地解决这个问题。


碰到底线咯 后面没有啦

本文标题:matlab笔记:MEX文件函数使用中的问题

文章作者:高深远

发布时间:2020年01月21日 - 19:47

最后更新:2020年01月28日 - 09:56

原始链接:https://gsy00517.github.io/matlab20200121194751/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%