网上可以找到很多应用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. [ASP.NET]从Request.Url获取根网址的最简单方法

    在拼接绝对路径的网址时,经常需要从Request.Url中获取根网址(比如http://www.cnblogs.com),然后与相对路径一起拼接为绝对路径. 以前的做法如下: var uri = Re ...

  2. Java学习记录-Lambda表达式示例

    List<Integer> userIds=userInfoList.stream().map(m->m.getUserId()).collect(Collectors.toList ...

  3. 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis

    springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...

  4. mongoexport

    导数据 数据同步 mongodb无自增id 数据断点 mongoexport — MongoDB Manual https://docs.mongodb.com/manual/reference/pr ...

  5. 在一台server上部署多个Tomcat

    版权声明: https://blog.csdn.net/u011518709/article/details/27181665 在一台server上配置多个Tomcat的方法: 这几天因为在研究OGS ...

  6. Python中的MySQL接口:PyMySQL & MySQLdb

    MySQLdb模块只支持MySQL-3.23到5.5之间的版本,只支持Python-2.4到2.7之间的版本 PyMySQL支持 Python3.0以后的版本 PyMySQL https://pypi ...

  7. C#——文件上传(一般处理程序ashx)

    Framework版本:.Net Framework 4 1.FileInfo实体 using System; using System.Collections.Generic; using Syst ...

  8. HTTP--TCP连接

    几乎所有的 HTTP 通信都是由 TCP/IP 承载的,TCP/IP 是全球计算机及网络 设备都在使用的一种常用的分组交换网络分层协议集.客户端应用程序可以打开一 条 TCP/IP 连接,连接到可能运 ...

  9. bzoj1625 / P2871 [USACO07DEC]手链Charm Bracelet

    P2871 [USACO07DEC]手链Charm Bracelet 裸01背包. 看到自己1年半前写的30分code.......菜的真实(捂脸) #include<iostream> ...

  10. bzoj1617 / P2904 [USACO08MAR]跨河River Crossing

    P2904 [USACO08MAR]跨河River Crossing 显然的dp 设$f[i]$表示运走$i$头奶牛,木筏停在未过河奶牛一侧所用的最小代价 $s[i]$表示一次运$i$头奶牛到对面的代 ...