Windows 64 + Matlab 64 MEX混合编程初步


  • 说明
  • Matlab混合编程
    • 下载与安装编译器

      • Microsoft Windows SDK 71CC
      • TDM-GCCgccg
    • 选择编译器
    • 编写ccpp文件
      • mexFunction函数介绍
    • 编译多个ccpp文件
  • ProblemSolution
    • 找不到编译器或SDK

      • Problem
      • Solution
      • 注意
    • error C2143 syntax error
      • Problem
      • Solution

说明

  • Matlab版本:Matlab R2014a 64-bit
  • 操作系统版本:Windows 8.1 64-bit
  • 编译器:Microsoft Windows SDK 7.1(C/C++) 和 GNU编译器(有CygWin、MinGW、MinGW-64、TMD-64等等,这里选择TDM-64)

Matlab混合编程

下载与安装编译器

Microsoft Windows SDK 7.1(C/C++)

点此Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)打开下载页面,是镜像文件,选择64-bit版,文件大小500M+,全部安装需占磁盘近2G。

下载完成后根据提示安装即可,如果出现问题,安装失败,参考:Problem&Solution 部分。

TDM-GCC(gcc/g++)

点此tmd-gcc打开下载页面,选择64位版本,40M+,全部安装占用400M+磁盘空间。

根据以前使用经验,安装路径最好不要有空格中文。

安装完成后,开始 -> 运行 -> cmd打开Windows命令窗口,输入gcc -v,如下图所示,显示安装信息,说明安装成功:

最后的战斗:

因为Matlab不支持GNU的编译器,还得做点事,下面的方法来自Using GCC (MinGW) as MATLAB’s MEX compiler 中的Bogdan的解答:

下面的代码是从Bogdan主页上下载的mexopts.bat文件代码,使用时需要做一点小小的改动。

在下面的代码中找到:set MINGWPATH=p:\mingw64这句代码,将其中的路径p:\mingw64替换成你的TMD-GCC-64的安装目录,如我的是:E:\devtools\TDM-GCC-64,然后保存并将mexopts.bat文件copy到计算机如下路径(复制下面的路径地址,粘贴到资源管理器窗口地址栏,回车即可):

%USERPROFILE%\AppData\Roaming\Mathworks\MATLAB\R2014a\

下面是代码:

@echo off

:: NOTE: this is actually not a proper .bat file executed by Windows. MEX
::       parses it and only understands a very reduced set of commands:
::       "set" and "rem" apparently, everything else is ignored (behaves as
::       "rem"), so don‘t do any fancy batch stuff in here. There are some
::       undocumented special vars you can set here that will trigger MEX
::       to do fancy stuff.

:: You can use MinGW64 builds (win32 threads + seh unwinding) from here:
:: http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/

:: Tested with the following:
:: http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.1/threads-win32/seh/x86_64-4.9.1-release-win32-seh-rt_v3-rev1.7z

:: Set this to your Mingw64 top folder, where you extracted the above
set MINGWPATH=p:\mingw64

:: Leave these alone unless you know what you‘re doing.
set PATH=%MINGWPATH%\bin;%PATH%
set PRELINK_CMDS=echo.>%TEMP%\mexstaticlibs

:: You can have MEX run some commands before calling the linker.
:: The two examples below will cause gcc to output the full path to some
:: static libraries so you can link statically to them (see the
:: LINGFLAGSPOST special var below). You can set any command here, however.
rem set PRELINK_CMDS1=gcc -print-file-name=libwinpthread.a >> %TEMP%\mexstaticlibs
rem set PRELINK_CMDS2=gcc -print-file-name=libquadmath.a >> %TEMP%\mexstaticlibs
rem set PRELINK_CMDS3=...

:: You can have MEX run some commands also after calling the linker
:: (e.g. upx compress the output .mex)
rem set POSTLINK_CMDS1=upx -9 "%OUTDIR%%MEX_NAME%%MEX_EXT%"
rem set POSTLINK_CMDS2=...

:: You can change these if you really need to.
set COMPILER=g++
set COMPFLAGS=-c -I"%MATLAB%\extern\include" -DMATLAB_MEX_FILE
set OPTIMFLAGS=-O3 -funroll-loops -DNDEBUG
set DEBUGFLAGS=-g
set NAME_OBJECT=-o

set LINKER=g++
set LINKFLAGS=-shared -static-libstdc++ -static-libgcc -L"%MATLAB%\bin\win64" -L"%MATLAB%\extern\lib\win64\microsoft" -lmex -lmx -leng -lmat -lmwlapack -lmwblas

set [email protected]%TEMP%\mexstaticlibs
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"

:: EXAMPLES
:: ========

:: You can compile simple files using "mex file.cpp". To support more than 2^32 elements, use
:: "mex -largeArrayDims file.cpp" ... use this by default, unless you know what you‘re doing.

:: To add include dirs, lib dirs, or compile/link flags, do:
:: mex COMPFLAGS="$COMPFLAGS -std=gnu99 -Ix:/include/dir" LINKFLAGS="$LINKFLAGS -Lx:/libs/dir -lmylib" -largeArrayDims file.cpp

选择编译器

  1. 查看可用编译器:使用mex -setup查看可选择的编译器,如果没有需要自己安装,如果已安装且只安装了编译器Microsoft Windows SDK 7.1(C/C++),显示如下结果:

  2. 选择编译器:使用mex -setup lang选择编译器,如mex -setup C++选择C++编译器,如下图:

  3. 如果你也按上面TDM-GCC(gcc/g++) 中讲的方法,配置了TDM-GCC-64位的编译器,那么,你会发现结果如下:

    刚开始我也以为不能用,后来试着编译了一下,竟然可以!

    DT.c文件中重复定义了无穷大,注释掉,就没有提示啦!

编写c/cpp文件

与普通的C文件的编写有两点不同:

  1. 包含mex.h头文件,即:#include "mex.h"
  2. 编写mexFunction函数。

下面以一个求和的例子说明:

#include "mex.h" // 使用MEX文件必须包含的头文件
// 执行具体工作的C函数
double add(double x, double y)
{
    return x + y;
}
// MEX文件接口函数
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
    double *z;
    double x, y;
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    z = mxGetPr(plhs[0]);
    x = *(mxGetPr(prhs[0]));
    y = *(mxGetPr(prhs[1]));
    *z = add(x, y);
}

Matlab命令窗口输入mex add.cpp,运行结果如下图:

mexFunction函数介绍

mexFunction函数接口如下:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

可见,是没有返回值的,其实是通过指针数组plhs传递的。它共有四个参数,即左边的输出参数及数目和右边的输入参数及数目,具体参数意义如下:

参数 意义 英文全称 类型
nlhs 左边输出参数的数目 number of left-hand side 整型(int)
plhs 指向输出参数的指针 pointer of left-hand side 指针数组
nrhs 右边输入参数的数目 number of right-hand side 整型(int)
prhs 指向输入参数的指针 pointer of right-hand side 指针数组

详情参考:

  1. Matlab参考-MEX库
  2. MATLAB中mexFunction函数的接口规范(转载)
  3. Matlab与C语言程序的应用编程接口
  4. matlab和C/C++混合编程–Mex

编译多个c/cpp文件

假设A.c调用B.cB.c调用C.c

可以使用如下命令编译:

mex C.c
mex B.c
mex A.c

或者

mex A.c B.c C.c

Problem&Solution

找不到编译器或SDK

Problem

提示:“未找到支持的编译器或 SDK”,如下图:

Solution

根据Matlab的提示,安装:Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO),在下载页面,有三个ISO文件可以选择,如下表选择第三个,即amd64

名称 版本
GRMSDK_EN_DVD.iso x86
GRMSDKIAI_EN_DVD.iso Itanium
GRMSDKX_EN_DVD.iso amd64

注意

如果安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时出现如下错误:

A problem occurred while installing selected Windows SDK components.

Installation of the “Microsoft Windows SDK for Windows 7” product has reported the following error: Please refer to Samples\Setup\HTML\ConfigDetails.htm document for further information.

Please attempt to resolve the problem and then start Windows SDK setup again. If you continue to have problems with this issue, please visit the SDK team support page at http://go.microsoft.com/fwlink/?LinkId=130245.

Click the View Log button to review the installation log.

To exit, click Finish.

如下图:

解决办法

出现此问题,很可能是你的PC机已经安装了:Microsoft Visual C++ 2010,而在安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时默认选择安装Microsoft Visual C++ 2010,如下图,造成的冲突,可以卸载已经安装的,注意32和64位的都要卸载

卸载完成后从新安装即可!!!

error C2143: syntax error

Problem

提示错误:error C2143: syntax error : missing ‘;’ before ‘type’,如下图所示:

Solution

出现这种现象,很可能是你在用VC的编译器编译GNU的C语言写的代码,两个编译器中的C标准不一样。

一种方法是将文件后缀名.c,改成.cpp,重新编译,但可能还会有其它的错误。

如果源文件是GNU的C代码,建议安装相应的编译器,然后编译,可参考TDM-GCC(gcc/g++)


  • 说明
  • Matlab混合编程
    • 下载与安装编译器

      • Microsoft Windows SDK 71CC
      • TDM-GCCgccg
    • 选择编译器
    • 编写ccpp文件
      • mexFunction函数介绍
    • 编译多个ccpp文件
  • ProblemSolution
    • 找不到编译器或SDK

      • Problem
      • Solution
      • 注意
    • error C2143 syntax error
      • Problem
      • Solution
时间: 2024-10-14 07:13:30

Windows 64 + Matlab 64 MEX混合编程初步的相关文章

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效

[转] Matlab与C++混合编程,添加OpenCV库

原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法 调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考

Matlab与C++混合编程,添加OpenCV库

最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考资料1,但其写的不够详细

matlab与vs混合编程/matlab移植

前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部的vs程序调用,实现混合编程. 实现步骤 1.matlab中算法代码编译生成库文件.头文件等: 2.创建并配置VS工程: 3.安装配置MCR方便软件移植: 实现环境 matlab版本:matlab2015a vs版本:vs2013 PC系统:win7_x64 实现过程 1.matlab中算法代码编译

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

【目录】Matlab和C#混合编程文章目录

本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.Matlab和C#混合编程文章目录 1.国内第一部C#.Net调用Matlab进行混合编程的视频教程[彻底免费无注册码] 2.国内第一部Matlab和C#.Net混合编程入门级视频教程[完全免费]  3.[原创]Matlab与.NET混编解决人脸识别问题  4.[原创]Matlab与.NET基于类型安全的接口编程入门   5.[原创]Matlab.NET混编调用Figu

matlab 2012 vs2010混合编程

电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Program Files\opencv 补充说明: 在配置前,先检查一下系统变量: 1.若缺少系统变量(该路径必须添加!!!): D:\Program Files\MATLAB\R2012a\runtime\win64 导致结果:程序无法正常启动0x000007b.请单击“确定”关闭应用程序 注意变量配置后

Mex混合编程专题一:Mex环境搭建

使用Matlab时间长了,难免会碰到使用mex文件的经历,不管是别人的还是自己的,就比如MatConvNet(http://www.vlfeat.org/matconvnet/)使用了混合编程的技术实现训练速度的提高. 1. MEX的是什么? 写MEX程序其实就是写一个DLL程序,不出意外的话,按照mex文件规范生成的dll文件,把尾缀由dll改成mexw32/mexw64是都能是合理的. 2. VS2010中配置环境 打开VS2010, 新建项目, 选择MFC DLL,建立mextest项目.

VC调用matlab dll方式混合编程(c风格--例2)<二>

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -B csharedlib:ellipsefit ellipsefit.m (此方式为c风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序设计>刘维,第