为什么在matlab中生成不了c的dll文件

为什么在matlab中生成不了c的dll文件,第1张

版本低找不到编译工具。matlab是一款非常强大的软件,在matlab中生成不了c的dll文件是因为版本低找不到编译工具,MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。

你可以在m函数文件中编写调用mat的语句,函数输入变量设为一字符变量,c#中编写代码将文件路径作为调用编译好的dll文件中函数方法的输入参数啊。这样就不需要将mat数据文件一起编译,同样实现对数据的分析。不知道对您有用不。

在Matlab的Help中搜索"Calling

Functions

in

Shared

Libraries"即可看到关于此内容的帮助文档。

下面以一个简单的小例子演示Matlab调用DLL的过程:

1、编译器准备

在Matlab的命令窗口输入:mex

-setup

选择你的编译器,我的是:

[2]

Microsoft

Visual

C++

2008

SP1

in

c:\Program

Files\Microsoft

Visual

Studio

90

2、编写你自己的DLL

在Visual

Studio

2008中新建一个Win32的Dll工程,不妨设名字为MatlabDllTest

编辑MatlabDllTestcpp:

#include

"MatlabDllTesth"

double

add(double

x,

double

y)

{

return

(x+y);

}

编辑MatlabDllTesth:

#ifndef

MATLABDLLTEST_H

#define

MATLABDLLTEST_H

#ifdef

__cplusplus

extern

"C"

{

#endif

__declspec(dllexport)

double

add(double

x,

double

y);

#ifdef

__cplusplus

}

#endif

#endif

3、加载DLL:把编译连接之后产生的MatlabDllTestdll和MatlabDllTesth文件拷贝到Matlab的当前工作目录下,输入

loadlibrary('MatlabDllTest','MatlabDllTesth');

(一定要有这步,如果dll不成功,会显示错误原因)

4、查看DLL中导出的函数

libfunctions

MatlabDllTest

-full

-full选项会列出导出函数的详细输入和输出参数,这是输出信息如下:

Functions

in

library

MatlabDllTest:

double

add(double,

double)

5、调用函数

calllib('MatlabDllTest',

'add',

13,

46)

此时就会输出正确的结果

ans

=

59000

总结:这个例子比较简单,只是为了演示整个过程,如果真的用到了Matlab来调用外部DLL的这种方式的话,就要注意DLL工程要符合Matlab的要求,详细信息请自己查看Matlab的帮助文件。

matlab可用内存有限,好像默认256M最多512M,超出的话就出错;不是混合编程的原因,直接在matlab也会出现这种错误。

这是网站上给的建议:

参考网站:>

通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及 *** 作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将m程序转成dll文件!

一、使用matlab将m转成dll文件

1、在命令行中输入mex -setup

提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 60 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。

2、在命令行中输入mbuild -setup

这里的选项和上面类似,依次选择环境确定。

3、生成dll文件

一句命令mcc -W cpplib:add -T link:lib addm

前面的add表示生成的dll文件名,后面的addm顾名思义是m文件名。生成后会多出8个文件,有用的是addctfadddll addlib addh4个文件,据说新版的Matlab不会生成ctf文件。

二、VC60中调用生成的dll文件

上面生成的dll文件,我们可以借助VC60的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:

1、addm文件

function [a,b]=add(x,y)

a=2x+y;

b=3y;

end

注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;

2、addh文件

截取其中一段关键代码如下:

extern void add(int nargout, mwArray& a, mwArray& b

, const mwArray& x, const mwArray& y);

实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!

3、C++中调用dll文件

(1)新建空工程,将上面提及的4个文件放到工程目录下;

(2)VC++目录中包含目录:matlab 内的include目录

比如我的是 E:\MATLAB7\extern\include

(3)VC++目录中库目录:matlab 内的lib目录

E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!

(4)工程属性-》连接-》输入-》附加依赖项

输入:addlib mclmcrrtlib mclmcrlib,第一个是生成的。或者在预处理中加入下面代码

#pragma comment(lib, "mclmcrrtlib")

#pragma comment(lib, "mclmcrlib")

#pragma comment(lib, "addlib")

4、C++代码

#include <iostream>

#include "addh"

using namespace std;

int main()

{

if(!addInitialize())

{

cout<<"initilize failed!!!"<<endl;

return -1;

}

mwArray a(1,1,mxDOUBLE_CLASS);

mwArray b(1,1,mxDOUBLE_CLASS);

a(1,1)=20;

b(1,1)=30;

mwArray x(1,1,mxDOUBLE_CLASS);

mwArray y(1,1,mxDOUBLE_CLASS);

//输出参数个数,输出参数,输入参数。

add(2,x,y,a,b);

double i=new double;

double j=new double ;

xGetData(i,1);

yGetData(j,1);

cout<<"x="<<i<<" y="<<j<<endl;

getchar();

return 0;

}

注意:addInitialize()一定要!

以上就是关于为什么在matlab中生成不了c的dll文件全部的内容,包括:为什么在matlab中生成不了c的dll文件、用MATLAB编译.dll文件给C#调用时,怎么把MATLAB中的.mat文件和.m文件一起编译进去。、怎么用matlab调用dll文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10165502.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存