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.
因篇幅问题不能全部显示,请点此查看更多更全内容