如何将MATLAB程序编译产生DLL

如题所述

把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

下面是这个例子用到的m代码。它定义了一个名为myadd2的函数

function [y,z] = myadd2(a, b)

% dummy function, just to demonstrate the idea

y = a+b;

z = a+2*b;

end
复制代码
首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:

mcc -W cpplib:libmyadd2 -T link:lib myadd2
复制代码
结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。

然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。

接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->;Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。

然后把相应的lib所在目录加到linker的额外搜索路径上

接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开

最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。

#include "stdafx.h"

#include <iostream>

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libmyadd2.h"

int _tmain(int argc, _TCHAR* argv[])

{

std::cout << "Hello world!" << std::endl;

/* Initialize the MCR */

if( !mclInitializeApplication(NULL,0) )

{

std::cout << "Could not initialize the application!" << std::endl;

return -1;

}

// initialize lib

if( !libmyadd2Initialize())

{

std::cout << "Could not initialize libmyadd2!" << std::endl;

return -1;

}

try

{

// declare and initialize a

mwArray a(2, 2, mxDOUBLE_CLASS);

double *aData;

aData = new double[4];
复制代码
本帖隐藏的内容
int i;

for( i=0; i<4; ++i)

{

aData = 1.0*i;

}

// print output

std::cout << "a = " << std::endl;

std::cout << aData[0] << ",\t" << aData[1] << std::endl;

std::cout << aData[2] << ",\t" << aData[3] << std::endl;

a.SetData(aData, 4);

// declare and initialize b

mwArray b(2, 2, mxDOUBLE_CLASS);

b(1,1) = 11.;

b(1,2) = 12.;

b(2,1) = 21.;

b(2,2) = 22.;

mwArray y(2, 2, mxDOUBLE_CLASS);

mwArray z(2, 2, mxDOUBLE_CLASS);

// call the function

myadd2(2, y, z, a, b);

// copy data from mwArray to C++ objects

// allocate outputs

double *yData, *zData;

yData = new double[4];
复制代码

if( yData == NULL )

{

std::cout << "Failed to allocate memory for yData!" << std::endl;

return -1;

}

zData = new double[4];

if( zData == NULL )

{

std::cout << "Failed to allocate memory for zData!" << std::endl;

return -1;

}

// copy data from mwArray to C++

y.GetData(yData, 4);

z.GetData(zData, 4);

// print output

std::cout << "y = " << std::endl;

std::cout << yData[0] << ",\t" << yData[1] << std::endl;

std::cout << yData[2] << ",\t" << yData[3] << std::endl;

std::cout << "z = " << std::endl;

std::cout << zData[0] << ",\t" << zData[1] << std::endl;

std::cout << zData[2] << ",\t" << zData[3] << std::endl;

// deallocate memory

delete [] aData;

delete [] zData;

delete [] yData;

}

catch( const mwException& e)

{

std::cerr << e.what() << std::endl;

}

// terminate the lib

libmyadd2Terminate();

// terminate MCR

mclTerminateApplication();

return 0;

}
温馨提示:内容为网友见解,仅供参考
无其他回答

Matlab代码转C并编译为dll
首先,确保编译器已设置,如选择Vs2015,使用命令mex -setup来配置。2.在Matlab代码中添加codegen注释,告知它需要编译的函数,并检查代码是否有误。3.在Matlab命令行中使用codegen命令进行编译,生成的文件包括C源码和编译后的DLL,以及详细的编译报告。4.为了验证DLL,创建一个测试工程,如Qt Console Appl...

如何用matlab生成dll文件
一、使用matlab将.m转成dll文件 1、在命令行中输入mex -setup 提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C\/C++ version 6.0 in E:\\Program Files\\Microsoft Visual Studio”,根据自己实际情况选择。2、在命令...

C++调用MATLAB生成的dll文件
首先,确保创建了希望转换成 DLL 的函数。例如,可以将以下 MATLAB 代码保存为 file `myFunction.m`:`matlab function result = myFunction(x, y) result = x + y; end`开启 MATLAB Compiler SDK 并选择 Library Compiler,然后设置生成的是 C Shared Library。添加函数并确定输出目录,点击 "Pack...

matlab的simulink如何生成dll文件?
首先,建立一个Simulink模型,确保输入输出通过Simulink中的Input,Output元件来表示。为减少生成的代码文件数量并保持逻辑清晰,将模型封装为Subsystem子模块,同时暴露输入和输出接口。接着,调整Simulink属性,设置算法运行方式为定步长。完成模型自动建立工程,随后关闭VS2015。此时,打开自动生成的工程进行配置。...

C++调用MATLAB生成的dll文件
- MATLAB Coder生成原生代码,性能更好,但可能不支持所有MATLAB特性。在C\/C++中调用DLL1. 将DLL文件链接到C\/C++项目,确保输出目录正确。2. 包含MATLAB生成的头文件,链接MATLAB Runtime和DLL。3. 编译并运行C++程序,完成调用。以上是将MATLAB函数转化为C++调用DLL的基本流程。具体操作会根据项目需求有...

怎样用VB调用Matlab生成的dll 详细??
MATLAB - > MATLAB COMBuilder - > MATLAB COM Builder”,启动MATLABCOMBuilder。1. 建立工程,选择菜单“File - > New Project”,设置工程参数。设置的工程名为COM 组件编译后的文件名称,也可以输入新类,点击“Add”建立新类。1. 点击菜单“Project - > Add File. . . ”,向工程中加入...

MATLAB7.0 的compiler如何把.p文件编译成了vc6.0调用的DLL文件
假设你的文件名叫做myfun.p 在命令行输入:>> mcc -W lib:myfun -T link:lib myfun.p 你就会产生相应的dll和.h文件。这是我的测试结果:如果你是高版本的matlab,直接试用deploytool, 图形化界面,非常简单。

matlab能生成dll文件吗
matlab下生成的dll实际上还是com控件,可以自动生成注册文件,运行即可注册。我实际使用了,发现存在2个问题:1、速度很慢;2、数组类型不工作;只可以在参数为数字时候正确。2006a版本以前可以输入comtool,即可。在2006a版本以后,就是输入:dotnettool,然后弹出一个对话框的生成东西,只要简单的配置,就...

matlab如何调用dll文件
MATLABDLLTEST_H define MATLABDLLTEST_H ifdef __cplusplus extern "C"{ endif __declspec(dllexport)double add(double x,double y);ifdef __cplusplus } endif endif 3、加载DLL:把编译连接之后产生的MatlabDllTest.dll和MatlabDllTest.h文件拷贝到Matlab的当前工作目录下,输入 loadlibrary('Matlab...

请教各位关于qt调用matlab生成的DLL的问题
1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,gcc -fpic -c add.c gcc -fpic -c sub.c 生成中间文件add.o和sub.o 2>其次生成动态库 gcc -shared –o libtiger.so add.o sub.o 生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和...

相似回答