之前在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编译器版本。
于是我先查看了当前使用的编译器的版本。方法如下:
- 在MinGW-w64编译器的安装目录中,找到gcc.exe可执行文件的存在位置。
- 打开命令行,切换到刚刚找到的gcc.exe文件所在的目录。
- 键入
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 | if is_octave() |
我用的是matlab,不是octave(后者相当于轻量级的免费matlab,语法什么的基本一致),那么执行的应该是else
后面的语句,而在这里可以看到调用ut的命令。
于是我就把这里的-lut
改成了-Lut
试了一下,果然成功了。
其实用有搜索功能的IDE的话或许能够更快地解决这个问题。