网上可以找到很多应用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. Windows下Git免密码pull&push

    Windows下Git在使用http方式的时候clone,pull,push需要输入用户名及密码,通过以下设置可以免密码 在用户文件夹创建文件.git-credentials内容如下 https:// ...

  2. 一次tns连接错误的解决过程

    --同事hadoop连接oracle导入数据,界面报错,后台alert日志报错tns相关错误: **************************************************** ...

  3. android(十五) FTP的两种工作模式

    (一)PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链 当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我打开了 ...

  4. 【Loadrunner接口测试】什么情况需要区分PC和手机端去做压测?

    1.PC和手机本身访问的都是接口,能有啥不一样的 这个一般看不出来,除非你们开发给APP的接口定义为http://api.mobile.com之类的 网站是网站,APP是APP但是不论是网站还是APP ...

  5. 测试命令运行时间:timeit和profile

    先说timeit from timeit import Timer def test1(): n=0 for i in range(101): n+=i return n def test2(): r ...

  6. PHP debug_backtrace() 函数打印调用处的调试信息

    http://php.net/manual/zh/function.debug-backtrace.php debug_backtrace (PHP 4 >= 4.3.0, PHP 5, PHP ...

  7. Swagger2 生成 Spring Boot API 文档

    Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.本文主要介绍了在 Spring Boot 添加 Swagger 支持, 生成可自动维护的 A ...

  8. PAT 1083 List Grades[简单]

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...

  9. 模块讲解----subprocess模块

    历史 #输出结果到屏幕上,并不返回执行状态os.system('dir')#保存命令的执行结果输出ret = os.popen('dir').read() 问题:上面2条是把命令结果保存下来了,但是返 ...

  10. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)

    莫名其妙的编译总会报错 异常来自 HRESULT:0x80070057 (E_INVALIDARG) 未能加载程序集....... 几次删除引用然后重新引用程序集还是报错 奔溃中.... 网上搜索还真 ...