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中算法代碼編譯生成庫文件、頭文件等;

1)在matlab寫一個測試代碼(一般是系統算法對應matlab函數);

function [sum, prod] = sum_prod(p1, p2)
sum = p1+p2;
prod = p1.*p2;
end

2)生成庫文件、頭文件等;

方法有兩種,一種是使用matlab命令行,一種是使用matlab菜單欄工具。本文使用的是第二種方法。

方法一:

(1)在命令行輸入命令!mcc查看是否帶有mcc編譯器;

(2)命令窗口輸入mbuild -setup選擇要使用的c++編譯器,本文選擇的是mex -setup C++ -client MBUILD 編譯器;

 

(3)命令窗口輸入deploytool命令,剩余步驟參考方法二;

方法二:

(1)matlab命令行輸入deploytool即可;

(2)輸入deploytool命令之后出現以下對話框,選擇Library Compiler選項;

(3)按照下圖指示步驟生成文件;

 

(4)生成的文件夾如下圖,所需要的庫文件、頭文件在for_redistribution_files_only文件夾中;

 

(5)將相關庫文件、頭文件復制到VS工程目錄下;

 

2.創建並配置VS工程;

1)創建VS工程,新建源文件作為測試;

#include <iostream>
#include "sum_prod.h"
#include "mclmcrrt.h"
#include "mclcppclass.h"

#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"sum_prod.lib")

using namespace std;

int main()
{
    if (!sum_prodInitialize())  //必須寫
    {
        //cout << "初始化失敗!" << endl;
        return -1;
    }
    double p[2][2] = { 1, 2, 3, 4 };
    mwArray X(2, 2, mxDOUBLE_CLASS);
    mwArray Y(2, 2, mxDOUBLE_CLASS);
    mwArray SUM(2, 2, mxDOUBLE_CLASS);
    mwArray PROD(2, 2, mxDOUBLE_CLASS);
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            X(i + 1, j + 1) = p[i][j];
            Y(i + 1, j + 1) = p[i][j];
        }
    }
    sum_prod(2, SUM, PROD, X, Y);

    double  sum[2][2], prod[2][2];
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            sum[i][j] = SUM(i + 1, j + 1);
            prod[i][j] = PROD(i + 1, j + 1);
        }
    }
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << sum[i][j];
        }
        cout << endl;
    }
    cout << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            cout << prod[i][j];
        }
        cout << endl;
    }
    cout << endl;
    system("pause");
    return 0;
}

2)配置VS工程;

(1)配置matlab的屬性(博客中使用的是matlab2015a版本);

項目屬性VC++目錄選型中添加包含目錄和庫目錄;

包含目錄:C:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\include;

庫目錄:C:\Program Files\MATLAB\MATLAB Production Server\R2015a\extern\lib\win64\microsoft;

(2)鏈接器輸入選項添加附加依賴項;

mclmcrrt.lib;

sum_prod.lib

另一種方法是直接在源文件中添加語句;

#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"sum_prod.lib")

注意:

不同的源文件對應的lib可能會有不同;

一般如果缺少lib的話會出現如下圖所示的報錯信息;

(3)另,直接將打印信息輸出到控制台,將會占用內存,可以使用下圖所示的方法將打印信息保存在txt文件中;

打開cmd,定位到可執行文件所在目錄,按照下圖操作即可得到日志文件log.txt;

 

3.安裝配置MCR方便軟件移植;

要想在沒有安裝matlab的電腦上運行matlab程序,不想安裝matlab,需要安裝MCR編譯器;

1)MCR安裝程序;

(1)官網math上下載;

(2)在matlab安裝目錄下復制;

文件目錄:(我的是C:\Program Files\MATLAB\MATLAB Production Server\R2015a\toolbox\compiler\deploy\win64)

.\R2015a\toolbox\compiler\deploy\win64;

 

2)安裝MCR編譯器;

(1)點擊安裝MCRInstaller.exe;

(2)創建安裝目錄;

(3)開始安裝,接受許可條款;

(4)選擇安裝路徑,等待安裝完成即可;

  本文使用的是默認安裝;

3)配置環境變量;

安裝完成之后需要將MCR編譯器安裝目錄添加到系統環境變量中;

(1)我的電腦>屬性>高級系統設置;

 

(2)在系統屬性高級中點擊環境變量;

 

(3)系統變量中新建環境變量;

(4)編輯添加系統變量;

變量值就是MCR安裝目錄(本文默認目錄C:\Program Files\MATLAB\MATLAB Runtime\v85\runtime\win64);

參考

1.混合編程:http://blog.csdn.net/wind_liang/article/details/51402224

2.MCR安裝:https://jingyan.baidu.com/article/19020a0a057462529d2842d6.html

3.http://blog.csdn.net/sjhuangx/article/details/49305237

做自己該做的事情,做自己喜歡做的事情,安靜做一枚有思想的技術媛。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM