[改写] matlab转C/C++ 的混合编程 (beta版)

来源:互联网 发布:unity3d塞尔达 编辑:程序博客网 时间:2024/06/06 03:26

   由于项目需要,我们需要把用matlab写的语音处理函数转换为C/C++能够链接上的库文件,从而接到C/C++的工程中去。这听起来简单,但是做起来却比这复杂得多,本篇博文是一个小小的总结,主要内容改写自我们组mm的博文,我的原创的地方主要是移植中遇到的问题的解决。

  mm的博文地址是:http://bingxinye1.blog.163.com/blog/static/1687970982011839213683/

  我用的matlab版本是:7.8.0(R2009a)

  以下是正文:

 

步骤一:Matlab编译环境设置(一)

    1、在Matlab命令窗口中输入 mbuild -setup

    2、命令窗口出现:

         Please choose your compiler for building standalone MATLAB applications: 
         Would you like mbuild to locate installed compilers [y]/n?

         选择输入:y

    3、命令窗口出现:(注:有可能因为个人电脑安装别的编译器不同,显示有所区别)

         Select a compiler:
        [1] Lcc-win32 C 2.4.1 in C:\PROGRA~1\MATLAB\R2009a\sys\lcc
        [2] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio
 
        [0] None
 
       Compiler:

       选择输入:2

    4、命令窗口显示:

         Please verify your choices:
 
        Compiler: Microsoft Visual C++ 6.0
        Location: D:\Program Files\Microsoft Visual Studio  (是电脑VC的位置)
 
       Are these correct [y]/n?

      选择输入:y

    5、命令窗口显示:

       Trying to update options file: C:\Documents and Settings\Administrator\Application   

       Data\MathWorks\MATLAB\R2009a\compopts.bat

       From template:              C:\PROGRA~1\MATLAB\R2009a\bin\win32\mbuildopts\msvc60compp.bat 
 
      Done . . .

  

步骤二:Matlab编译环境设置(二)

    继续在命令窗口中输入:mex -setup

    接下来的选择和“步骤一”的一样。

 

步骤三:对VC编译环境进行设置

    1、打开Microsoft Visual C++ 6.0 。新建一个基于对话框的MFC工程。这里命名为Huatu

         (File ->New ->MFC AppWizard[exe] (Project name:Huatu) ->dialog based ->Finish)

         选择:Tools ->Options ->Directories->Show directories for

          1)、选择Include files 添加文件路径  C:\PROGRAM FILES\MATLAB\R2009A\EXTERN\INCLUDE(注意:前面的路径随

               个人matlab安装路径而异)

           2)、选择Library files 添加库文件  C:\PROGRAM FILES\MATLAB\R2009A\EXTERN\LIB

                                                                  C:\PROGRAM FILES\MATLAB\R2009A\EXTERN\LIB\WIN32\MICROSOFT

 

步骤四:编写和编译.m文件

    在和C++连接前,最好先检验程序的正确性。

   文件名为:huatu_test.m

function y= huatu_test()
%UNTITLED Summary of this function goes here
%   Detailed explanation goes here
x=-10:0.1:10;
y=sin(x);
plot(x,y,'*');
end

  

步骤五:把.m文件转换成.dll文件

         1、在Matlab命令窗口中输入:mcc -t -h -L C -W lib:dllhuatu_test-T link:lib huatu_test.m(红色字体部分可根据自己的喜好命名)

          2、生成的文件中我们只要:dllhuatu_test.dll dllhuatu_test.h dllhuatu_test.lib 。把它们拷贝到project Huatu文件夹内。

         注意,生成文件真正有用的是这三个:文件名.h, 文件名.lib,文件名.dll,.h文件是函数说明,.lib和.dll文件一起构成动态链接库。

 

步骤六:嵌入你的C/C++项目

             在你的C/C++项目中包括刚才生成的.h文件,并且把.lib和.dll文件放在工作目录下并且包含,另外,还要包含matlab的两个.lib文件mclmcrrt.lib mclmcr.lib。总体的格式如下(另外,如果你用的是vs,那么要进行工作目录的设置,使得你的lib文件可被访问到):

#include "Test.h"//生成的.h文件
#pragma comment(lib,"Test.lib")
#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"mclmcr.lib")

 

至于参数的传递在此不多说,简单的调用示例如下:

 if(!dllhuatu_testInitialize())
 {
  MessageBox("No dll is found!");
 }
 mxArray *y=mxCreateDoubleMatrix(1,1,mxREAL);

 mlfHuatu_test(1,&y);
 dllhuatu_testTerminate();

步骤七:发行你的程序

          (未完待续)

 

可能遇到的问题:

      问题一:I18n:MissingICUData - ICU data not found.

     解法:(未完待续)     

 

      问题二:I18n:LocaleDatabaseNotFound - Cannot find the MATLAB locale database.The MATLAB process default locale is set to "en_US.US-ASCII".

      解法:在matlab目录下寻找icudt38l.dat或类似文件,放到exe同一个目录下即可。

原创粉丝点击