由于项目需要,我们需要把用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同一个目录下即可。