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\toolbox\simulink\simulink\set_param.bi
 
编译后得到如下一批文件:
f portssample.msample.dllsample.hsample_mcc_component_data.c sample.cpsample.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有关的行(第8182行)注释掉然后重新编译看是否有效。
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有关的行(第8182行)注释掉然后
重新编译看是否有效。 [/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\toolbox\simulink\simulink\set_param.bi 
 
参见:
ulblog/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.m) 都无法运行,出现 
Undefined command/function 'set_param' 
Error in ==> matlabrc at 81 
 
解决方法: 
1、将 \MATLAB7\toolbox\compiler\deploy\matlabrc.m 中的 
81 set_param(0,'PaperType',defaultpaper); 
82 set_param(0,'PaperUnits',defaultunits); 
注释掉,或者干脆删掉。 
2、在 Matlab7 的命令窗口运行 rehash toolboxcache 
3、重新编译文件后即可运行。 
4、不用重新安装 MCR 
 
另有一问题描述见 www.mathworks/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地址: ulblog/trackback/65938
 
他山之石可以攻玉的意思   
 
Insomnia 发表于 2004-8-31 11:15
回复: 回复: M函数文件编译成DLL文件问题请教(
[quote][b]SCIE wrote:[/b]
我是用 -l 参数进行编译的,生成的dll种的函数名都没有下划线。 [/quote]
 
SCIE 兄:可否把你编译好的DLL文件发给我对比一下?可发到empirical@citiz后者做回帖的附件. 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只代入一个参数是错误的,mxArrayMATLAB用于存储数据的一个结构体,它可以存储MATLAB中的任意类型的数据。
另外,在调用该dll之前,必须先调用mclInitializeApplication进行初始化,然后再调用sampleInitialize或者sampleInitializeWithHandlers,之后才能调用mlxSample或者mlfSample,最后要依次调用sampleTerminatemclTerminateApplication
 
mclInitializeApplicationmclTerminateApplication两个函数在mclmcrrt70.dll文件中。
 
按照你的代码所写windll.sample.mlfSample(10),在PYTHON语言中我想是不可能定义mxArray类型的变量了。我建议你再做一个dll文件为接口,该dll文件再去调用sample.dll