网上可以找到很多应用Visual Studio编写、编译mex文件,并与MATLAB联合调试的文章。但这只限于Win平台,网上许多源码都是.mexa64的文件,它们的作者是怎么调试的呢?这里我介绍一下我的方式。
利用Qt的IDE,建立CMake工程,从而实现一次编码,多平台复用;而且CMake还可以自动设置Matlab的Include和Lib目录,免去很多麻烦;再者,IDE的GUI能让调试直观不少,比直接用gdb调试mex方便。
一、实现平台:
操作系统:Linux Mint 17.3, Ubuntu 14.04, Linux Mint 18, Ubuntu 16.04.
编程工具:CMake 3.7, 系统自带的gcc, 系统自带的gdb, Matlab 2016b, Qt Creator 5.7
二、建立CMake工程:
在Qt中新建CMake工程,其结构可以参见
这里有它的中文说明
http://www.linuxdiyf.com/linux/16589.html
其中注意几点:
1)Matlabdef.def文件的内容是
EXPORTS mexFunction
2)FindMatlab.cmake文件是用于查找本地Matlab的Include和Lib路径的。CMake通过将其加入CMAKE_MODULE_PATH变量,实现了此查找功能。这里一定要把环境变量MATLAB_ROOT设为Matlab根目录,例如,我在~/.bashrc下加入
export MATLAB_ROOT=/usr/local/MATLAB/R2016b
3)编译生成的mex文件可以指定位置(即make后,mex文件的生成位置,并不是指定make install之后的安装位置),在生成mex文件用的CMakeList.txt中设置LIBRARY_OUTPUT_PATH变量即可。例如,我在add_library()后面加上
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
就可把mex文件生成到构建目录(通常是build目录)的lib文件夹下了。
三、编译CMake工程:
用Qt Creator编译CMake工程,一定安装CMake 3.3.2以上版本。如果Edit里没有源码显示,别忘了点开左侧的Project;然后点Build->Run CMake,或者右键工程名,然后点右键菜单中的Run CMake,如图所示
针对CMake工程,详细的Qt Creator设置可以参考
http://doc.qt.io/qtcreator/creator-project-cmake.html
四、与Matlab联合调试:
可以用以下命令暂时解决问题,
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scop
若要彻底地解决这个问题,可以修改文件/etc/sysctl.d/10-ptrace.conf 将其中的
kernel.yama.ptrace_scope = 1
改为
kernel.yama.ptrace_scope = 0