1. 程式人生 > >Windows的MATLAB中用C語言寫SFunction的一些坑

Windows的MATLAB中用C語言寫SFunction的一些坑

mingw 編譯器 init 64bit -i tro ... -o env

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:\Program Files\mingw-w64\x86_64-4.9.4-win32-seh-rt_v5-rev0\mingw64"是包含有空格的,MATLAB並不能準確識別,所以可以把mingw64移動到不含空格的路徑下,比如"C:\mingw64"。
  2. 驗證一下:

    setenv(‘MW_MINGW64_LOC‘,‘C:\mingw64‘) % 先配置環境哦
    mex -setup 

    輸入如下圖所示:

    技術分享圖片

    這樣MinGW編譯器就配置好了。

3. 快捷編譯:

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可用的文件,在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. Mathwors關於空格的說明
  2. MATLAB2017b及其之後如何設置
  3. 感謝印度小哥的視頻解說

Windows的MATLAB中用C語言寫SFunction的一些坑