1.测试环境

  • 操作系统:Windows 10, 64bit
  • 编译器:MinGW64
    • 32位系统请下载对应的32位版本
  • MATLAB2017a
    • 2017a之后会略有不同

2. 配置环境与流程

  1. 下载编译器MinGW64,对于64位系统而言,需要下载个安装器,可以安装相应版本的gcc编译器,我选择的是gcc-4.9.4,在测试环境中可以正常运行

    1. 安装器是mingw-w64-install,安装时注意选择64位,同时安装完了还有一个坑:空格。
    2. 下载器默认的安装路径"C:Files-w64_64-4.9.4-win32-seh-rt_v5-rev0"是包含有空格的,MATLAB并不能识别该路径,所以可以把mingw64移动到不含空格的路径下,比如"C:"。
  2. 验证一下:

setenv('MW_MINGW64_LOC','C:\mingw64') % 先配置环境
mex -setup

输出如下图所示,这样MinGW编译器就配置好了。

配置成功输出

3. a + b 编译测试

setenv('MW_MINGW64_LOC','C:\mingw64')

myFunctionName = 'SFunctionName'

def = legacy_code('initialize');
def.SFunctionName = myFunctionName ;
% 注意,输入和输出的变量的名称只能是u1,u2...和y1,y2...
def.OutputFcnSpec = 'double y1 = add_2(double u1, double u2)';
% 设置用到的头文件或者源文件
def.HeaderFiles = {'add_2.h'};
def.SourceFiles = {'add_2.c}
def.InitializeConditionsFcnSpec = 'buffer_init()';

legacy_code('sfcn_cmex_generate', def);
legacy_code('compile', def) ;

以上代码可以在MATLAB中快捷编译,并且生成Simulink可用的文件"add_2.mex64",在Simulink中加入S-Function模块,并且将名字设置为"add_2"即可。

add_2.c就可以直接写一个两个数相加的程序验证一下就好了; add_2.h写个函数声明也就可以了。

// add_2.c
#include "add_2.h"

double add_2(double a, double b){
    return a + b ;
}

// add_2.h
#ifndef ADD_2_H
#define ADD_2_H
double add_2(double a, double b);
#endif

4. 参考

  1. Mathworks关于空格的说明
  2. MATLAB 2017后版本注意事项
  3. 印度小哥的解说