网上可以找到很多应用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 5.7

二、建立CMake工程:

在Qt中新建CMake工程,其结构可以参见此处

http://cn.mathworks.com/matlabcentral/fileexchange/45522-mex-cmake

或在这里下载

http://download.csdn.net/detail/fzq15980/9711446

这里有它的中文说明

http://blog.csdn.net/kxuehen/article/details/45851651

其中注意几点:

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以上版本。

Qt Creator要引入bash的环境变量,比如上面提到的MATLAB_ROOT就在这些变量中,方法是更改Qt Creator快捷方式里的Exec,(即.desktop文件,一般是~/.local/share/applications/DigiaQtOpenSource-qtcreator.desktop或/usr/share/applications/DigiaQtOpenSource-qtcreator.desktop)。例如我改成这样,加入了bash -i -c

Exec=bash -i -c /opt/Qt5.7.0/Tools/QtCreator/bin/qtcreator

同时注意把Qt Creator里的CMake生成器设置为CodeBlocks - Unix Makefiles (默认就是这个设置),如下图所示

如果Edit里没有源码显示,别忘了点开左侧的Project;然后菜单Build->Run CMake,或者右键工程名,然后点右键菜单中的Run CMake,如图所示

针对CMake工程,详细的Qt Creator设置可以参考

http://doc.qt.io/qtcreator/creator-project-cmake.html

四、与Matlab联合调试:

编译完成之后就可以打开Matlab,让Qt Creator使用gdb进行联合调试。在Qt Creator中设置断点,然后菜单Debug->Start Debuging->Attach to Running Application...

但我在联合调试时遇到2个错误:

1) 第一种可能出现的错误,如下图所示

可以用以下命令暂时解决问题,

 echo  | sudo tee /proc/sys/kernel/yama/ptrace_scop

若要彻底地解决这个问题,可以修改文件/etc/sysctl.d/10-ptrace.conf 将其中的

kernel.yama.ptrace_scope = 

改为

kernel.yama.ptrace_scope = 

2) 第二种可能出现的错误,如下图所示

这里的solib-search-path是gdb搜索动态链接库文件(或者叫共享库文件,即Linux里的.so文件或Win中的.dll文件)的目录,当然gdb也会在其工作的当前目录进行搜索。那么这个错误其实是说gdb找不到我们的mex文件了,所以我这里直接设置调试时的Working directory为mex所在目录,就可以让gdb直接找到mex文件了,设置方法如图所示

注:这里有个小技巧,我喜欢把Matlab代码和C++分开存放,所以想要在Matlab中调用新生成的mex文件,可以用Matlab里addpath命令,把mex文件所在的文件夹包含进去,如

addpath('~/mex/build/lib');

Qt Creator下应用CMake项目调试mex文件的更多相关文章

  1. 类似Visual Studio一样,使用Qt Creator管理多个项目,创建子项目

    1. 简介 QtCreator是一个十分好用的跨平台IDE,由于最近需要在Windows和Mac同时写一个C++的代码,使用VS和XCode不能实现项目的统一管理(可以使用cmake来组织源码,但是每 ...

  2. 【Qt开发】Qt Creator在Windows上的调试器安装与配置

    Qt Creator在Windows上的调试器安装与配置 如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试 ...

  3. 如何在VC++ 中调试MEX文件

    MEX文件对应的是将C/C++文件语言的编写之后 得到的相关文件加载到Matlab中运行的一种方式, 现对于Matlab 中的某些程序运行效率而言, C/C++ 代码某些算法的领域上面执行效率很高,若 ...

  4. 转 Visual C++6.0 与matlab联合编程(2)----Visual C++6.0 环境下编译和调试MEX文件

    我的最初想法是利用matlab的mex命令调用C++程序生成动态链接库的,但是测试程序(文中另附)通过了,自己的实际应用程序却没有过.还是把方法贴在这儿,以便自己以后进行整理. http://shij ...

  5. Qt Creator在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  6. 解决Qt Creator下 undefined reference to 'qmain(int,char**)'的问题

    Qt Creator运行以下程序: #include <QTextStream> #include <QList> int main(void) { QTextStream o ...

  7. vs调试MEX文件

    http://www.cnblogs.com/lukylu/p/4042306.html matlab里面无法单步调试mex函数,故需转到VS上面调试,这里采用VS2010. 参考网上很多人写的方法但 ...

  8. QT Creator 环境使用 remote debug 调试 arm 程序

    这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功.没有调试手段比较痛苦,今天又花了点时间,居然搞定了.粗做记录. 工具版本: 1. QtCrea ...

  9. 【转】Qt Creator在Windows上的调试器安装与配置

    https://www.librehat.com/qt-creator-on-windows-debugger-installation-and-configuration/

随机推荐

  1. 常用linq语法

    1.简单的linq语法 var ss = from r in db.Am_recProScheme select r; var ss1 = db.Am_recProScheme; string sss ...

  2. poj1961 & hdu1358 Period【KMP】

    Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20436   Accepted: 9961 Descripti ...

  3. Quartz学习记录

    参考资料: 官方网站 Quartz使用总结

  4. AngularJS 指令的 Scope (作用域)

    参考:https://segmentfault.com/a/1190000002773689 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的 ...

  5. webView返回不刷新

    [[NSUserDefaults standardUserDefaults] setInteger:2 forKey: @"WebKitCacheModelPreferenceKey&quo ...

  6. Python开发【Django】:时间处理

    时间格式化 做博客后台时,需要经常对数据库里面的时间格式(2017-02-17 02:10:44.308638)进行处理,格式化成自己想要的时间(列如年月日),下面就来记录下如何对时间进行处理 1.时 ...

  7. Mysql EXPLAIN 相关疑问: Using temporary ; Using filesort

    一.什么是Using temporary ; Using filesort 1. using filesort filesort主要用于查询数据结果集的排序操作,首先MySQL会使用sort_buff ...

  8. matplotlib常见绘图基础代码小结:折线图、散点图、条形图、直方图、饼图

    一.折线图 二.散点图 三.条形图 四.直方图 五.饼图 一.折线图折线图用于显示随时间或有序类别的变化趋势 from matplotlib import pyplot as plt x = rang ...

  9. PAT 1046 Shortest Distance[环形][比较]

    1046 Shortest Distance(20 分) The task is really simple: given N exits on a highway which forms a sim ...

  10. 如何确定selenium ID元素是否查找正确

    编写脚本时,如何确定通过id查找的id是否真实存在,点击css,然后输入#(代表id)id名,如#kd,回车之后,能返回结果,便代表存在.