您的当前位置:首页正文

matlab生成dll的编译错误

2023-06-20 来源:欧得旅游网


M函数文件编译成DLL文件问题请教

编译环境:MATLAB 7 R14

有如下函数

function y = sample (x)

   y = x +1;

保存为sample.m文件,然后执行如下命令编译:(有一个警告信息出现?!)

>> mcc -W lib:sample -T link:lib sample

  To get started, select MATLAB Help or Demos from the Help menu.

Warning: No matching builtin function available for

C:\\MATLAB7\oolbox\\simulink\\simulink\\set_param.bi

编译后得到如下一批文件:

sample.ctf, sample.exports,sample.m,sample.dll,sample.h,sample_mcc_component_data.c ,sample.c,sample.exp,sample.lib

其中*.dll文件可以在其他语言(我现在是用Python)中成功调入,当时不能执行函数

运算。我查遍GOOGLE的信息,猜测可能的原因是经编译后DLL文件中的函数名不在是原来的函数名(Functions may be exported with [b]mangled names[/b])。然后利用软件工具“Dependency Walker ”打开sample.dll则可以看到里面好像有五个函数:

_mlfSample

_mlxSample

_sampleInitialize

_sampleInitializeWithHandlers

_sampleTerminate

[b][color=red]问题请教:[/color][/b]

(1)编译时如何控制输出的DLL文件中的函数名?

(2)编译时的警告信息为何意?

非常感谢!

SCIE 发表于 2004-8-12 13:55 回复: M函数文件编译成DLL文件问题请教

我是用 -l 参数进行编译的,生成的dll种的函数名都没有下划线。

Insomnia 发表于 2004-8-12 16:04 回复: 回复: M函数文件编译成DLL文件问题请教

[quote][b]SCIE wrote:[/b]

我是用 -l 参数进行编译的,生成的dll种的函数名都没有下划线。 [/quote]

非常感谢回复。但不是很明白。:I

不是讲 -l 参数 和 -W lib -T link:lib 是等效的吗?

您说的方法我试过了。警告信息仍然存在。不知道这里说的[b]“生成的dll种的函数名都没有下划线\"[/b],是什么意思。我采用DEPENDS程序所看到的DLL中的函数仍然是有下划线的?

SCIE 发表于 2004-8-12 17:13 回复: M函数文件编译成DLL文件问题请教

不过我的确实是没有下划线的(用Depedency walker查看dll的输出函数,函数名都没有加下划线),可能与配置mcc时选择的编译器有关,我选的是VC6.0。

把toolbox\\compiler\\deploy\\matlabrt.m中与set_param有关的行(第81和82行)注释掉然后重新编译看是否有效。

Insomnia 发表于 2004-8-12 22:47 回复: 回复: M函数文件编译成DLL文件问题请教

[quote][b]SCIE wrote:[/b]

不过我的确实是没有下划线的(用Depedency walker查看dll的输出函数,函数名都没有加下划线),可能与配置mcc时选择的编译器有关,我选的是VC6.0。

把toolbox\\compiler\\deploy\\matlabrt.m中与set_param有关的行(第81和82行)注释掉然后重新编译看是否有效。 [/quote]

非常感谢。其实我面临的问题是:用其他程序来调用MATLAB生成的DLL文件是,其中的函数名与原来M文件中的函数名是否不同?不知道各位有没有使用C来调用MATLAB得到的DLL函数文件的经验,调用时函数名如何定义?

盼援手,非常感谢!

huajunw 发表于 2004-8-13 08:06 回复: M函数文件编译成DLL文件问题请教

默认都是加 mlf 在前面,而且只有第一个字母大写。

huajunw 发表于 2004-8-13 08:08 回复: M函数文件编译成DLL文件问题请教

Warning: No matching builtin function available for

C:\\MATLAB7\oolbox\\simulink\\simulink\\set_param.bi

参见:

http://genial.yculblog.com/post-65938.html

cwit 发表于 2004-8-13 15:09 回复: M函数文件编译成DLL文件问题请教

Why do I receive a set_param Warning or Error when Using MATLAB Compiler 4.0 (R14)?

山城棒棒儿军 @ 06-24 21:45

问题描述:

在按要求安装好 MCR 后,即使编译最简单的 hello.exe (hello.m) 都无法运行,出

Undefined command/function 'set_param'

Error in ==> matlabrc at 81

解决方法:

1、将 \\MATLAB7\oolbox\\compiler\\deploy\\matlabrc.m 中的

81行 set_param(0,'PaperType',defaultpaper);

82行 set_param(0,'PaperUnits',defaultunits);

注释掉,或者干脆删掉。

2、在 Matlab7 的命令窗口运行 rehash toolboxcache

3、重新编译文件后即可运行。

4、不用重新安装 MCR

另有一问题描述见

http://www.mathworks.com/support/solutions/data/1-O9PX9.html?solution=1-O9PX9

Subject:

Why do I receive a set_param Warning or Error when Using MATLAB Compiler 4.0?

Problem Description

Why do I receive a set_param Warning or Error when Using MATLAB Compiler 4.0 (R14)?

I am using the MATLAB Compiler and receive the following error:

Warning: No matching builtin function available for

$MATLAB/toolbox/simulink/simulink/set_param.bi

(where $MATLAB = the MATLAB root directory on my machine)

Why is this?

Solution:

This has been verified as a bug in the MATLAB Compiler 4.0 (R14).

In certain cases you may get a warning/error message regarding SET_PARAM not being found when using MATLAB Compiler 4.0 (R14). SET_PARAM is a SIMULINK function that is not supported by MATLAB Compiler.

To resolve this issue, you should modify the following file:

$MATLAB/toolbox/compiler/deploy/matlabrc.m

(where $MATLAB = the MATLAB root directory on your machine)

Comment out the following lines (numbers 81 and 82) that have a call to SET_PARAM.

set_param(0,'PaperType',defaultpaper);

set_param(0,'PaperUnits',defaultunits);

When you are finished, save these changes and issue the following command at the MATLAB command prompt:

rehash toolboxcache

评论 / Trackback地址: http://www.yculblog.com/trackback/65938

Insomnia 发表于 2004-8-31 11:15 回复: 回复: M函数文件编译成DLL文件问题请教(

[quote][b]SCIE wrote:[/b]

我是用 -l 参数进行编译的,生成的dll种的函数名都没有下划线。 [/quote]

SCIE 兄:可否把你编译好的DLL文件发给我对比一下?可发到*******************后者做回帖的附件. Thanks

SCIE 发表于 2004-9-1 08:11 回复: M函数文件编译成DLL文件问题请教

sample.m

function y = sample (x)

y = x +1;

Insomnia 发表于 2004-9-1 10:53 回复: M函数文件编译成DLL文件问题请教

SCIE,非常感谢!你得到的DLL文件中的函数的确是没有下划线的。

奇怪的是我也用

mcc -l sample

的命令进行编译,得到DLL文件的函数名却与你的不同(有两处不同,见附图),看

来还有问题没有搞清楚。

p.s. 我用的是MATLAB V7.0.0.19920 (R14)

SCIE 发表于 2004-9-1 17:38 回复: M函数文件编译成DLL文件问题请教

你在配置mcc的时候选择的是什么编译器?我选的是Visual C++ 6.0

Insomnia 发表于 2004-9-1 23:44 回复: M函数文件编译成DLL文件问题请教

的确,上述问题是由于编译器的不同造成的。非常感谢。

我本人是希望采用PYTHON语言来调用此DLL文件中的函数的,我知道在调用一个 dll 函数之前,必须了解该函数的调用协议,包括函数的名称,参数的数目和类型以及返回值类型。[color=red][b]敢问各位前面M文件生成的五个函数的含义如何?[/b][/color]

mlfSample

mlxSample

sampleInitialize

sampleInitializeWithHandlers

sampleTerminate

我在PYTHON语言中采用以下语句

windll.sample.mlfSample(10) 或 windll.sample.mlxSample(10)

都不能得到期望的 11 的答案。[color=red][b]各位应用其他语言(C,C++,vb)调用DL函数L时,传递参数需要有什么注意事项吗?(希望得到点提示,他山之石可以攻玉)[/b][/color]

[color=red]非常感谢![/color]

SCIE 发表于 2004-9-2 09:59 回复: M函数文件编译成DLL文件问题请教

【仅适用于MATLAB7.0】

用mcc -l sample.m编译后会生成三个c程序文件,其中在sample.c中有关于sample.dll中五个导出函数的定义,现只把原型贴出来。

bool sampleInitializeWithHandlers(mclOutputHandlerFcn

error_handler,mclOutputHandlerFcn print_handler);

bool sampleInitialize(void);

void sampleTerminate(void);

void mlxSample(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);

void mlfSample(int nargout, mxArray** y, mxArray* x);

由此可以看出在mlxSample或者mlfSample只代入一个参数是错误的,mxArray是MATLAB用于存储数据的一个结构体,它可以存储MATLAB中的任意类型的数据。

另外,在调用该dll之前,必须先调用mclInitializeApplication进行初始化,然后再调用sampleInitialize或者sampleInitializeWithHandlers,之后才能调用mlxSample或者mlfSample,最后要依次调用sampleTerminate和mclTerminateApplication。

mclInitializeApplication和mclTerminateApplication两个函数在mclmcrrt70.dll文件中。

按照你的代码所写windll.sample.mlfSample(10),在PYTHON语言中我想是不可能定义mxArray类型的变量了。我建议你再做一个dll文件为接口,该dll文件再去调用sample.dll。

Insomnia 发表于 2004-9-2 14:04 回复: M函数文件编译成DLL文件问题请教

Yes, that is the problem. I should learn the conventions of C.

Thank U very much. That's realy helpful.

因篇幅问题不能全部显示,请点此查看更多更全内容