网上可以找到很多应用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. TA-Lib中文文档(一):快速开始

    TA-Lib 简介: 这是一个Python 金融指数处理库TA-LIB,他是基于 Cython 而不是 SWIG. TA-Lib is widely used by trading software ...

  2. Mongo副本集的配置以及php node.js连接使用副本集

    最近弄了下mongodb的副本集, 首先说下没有认证情况的副本集,相对比较简单,因为环境有限,我在同一台服务器上做了模拟. --rest参数是打开web监控页面,比如我们这里监听37017端口,则打开 ...

  3. Redis 缓存穿透,缓存击穿,缓存雪崩的解决方案分析

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 一.什么样的数据适合缓存? 分析一个数据是否适合缓存,我们要从访问频率.读写比例.数据一致性等要求去分析.  二.什么 ...

  4. 前端调用后端的方法(基于restful接口的mvc架构)

    1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在 ...

  5. linux shell 正则表达式(BREs,EREs,PREs)差异比较(转)

    add by zhj: Python的正则表达式跟Perl很像,Python的re模块文档中也说"This module provides regular expression matchi ...

  6. windows下安装redis(转)

    add by zhj: redis相比memcached相比,性能上并没有绝对的优势.我们用redis的是因为它支持更多的数据类型,而且在分配给redis的内存用满了之后, redis也不会删除没有过 ...

  7. Linux学习-->如何通过Shell脚本实现发送邮件通知功能?

    1.安装和配置sendmail 不需要注册公网域名和MX记录(不需要架设公网邮件服务器),通过Linux系统自带的mail命令即可对公网邮箱发送邮件.不过mail命令是依赖sendmail的,所以我们 ...

  8. C++循环的内存释放问题?

    针对http://wenku.baidu.com/view/56d732ee856a561252d36ff2.html的内容测试一下. #include "A.h" #includ ...

  9. EasyUI Progressbar 进度条

    通过 $.fn.progressbar.defaults 重写默认的 defaults. 进度条(progressbar)提供了一种显示长时间操作进度的反馈.进度可被更新以便让用户知道当前正在执行的操 ...

  10. MySQL server has gone away With statement: INSERT INTO `students`......

    mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指client和MySQL server之间的链接断开了. 首选分析给出可能出现的 ...