找回密码
 注册
Simdroid-非首页
楼主: taohe

【原创】程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)

[复制链接]
发表于 2007-11-21 13:21:41 | 显示全部楼层 来自 陕西西安
原帖由 taohe 于 2007-11-20 22:03 发表
或者再试一下,在运行“mex -setup“之前,先运行

D:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT

已经试过了,不行的。
回复 不支持

使用道具 举报

发表于 2007-11-26 11:54:53 | 显示全部楼层 来自 江苏南京

用VC与Matlab混合编程遇到runtime错误

Simdroid开发平台
在同一个程序中要调用两个不同的接口连接,a.dll,b.dll,在VC中调用了a后,关闭并释放a的接口链接和MCR,再调用b时出现会出现runtime error。不知何故?我反复阅读了董先生的专著“深入浅出Matlab7.x混合编程”,还是无法解决
回复 不支持

使用道具 举报

 楼主| 发表于 2007-11-27 22:48:37 | 显示全部楼层 来自 新加坡
原帖由 wangjun2008 于 2007-11-26 11:54 发表
在同一个程序中要调用两个不同的接口连接,a.dll,b.dll,在VC中调用了a后,关闭并释放a的接口链接和MCR,再调用b时出现会出现runtime error。不知何故?我反复阅读了董先生的专著“深入浅出Matlab7.x混合编程”, ...


请参阅下面帖子中的回帖。也就是把对dll的初始化和终止放到vc程序的初始化和结束的地方。
http://www.simwe.com/forum/thread-809320-1-1.html
回复 不支持

使用道具 举报

发表于 2007-12-16 13:16:32 | 显示全部楼层 来自 辽宁鞍山

deploytool中的问题请教

运行deploytool后,选择“builder for java”,新建一个工程untitled2.prj,也将.m文件加入到untitled2class文件夹中了,点击“build the project”按钮后,在matlab命令窗口出现以下错误:
mcc -W java:untitled2,untitled2class -d D:\My Documents\MATLAB\untitled2\src -T link:lib -v class{untitled2class:D:\My Documents\MATLAB\drawplot.m}
mcc -W java:untitled2,untitled2class -d D:\My Documents\MATLAB\untitled2\src -T link:lib -v class{untitled2class:D:\My Documents\MATLAB\drawplot.m}
Compiler version: 4.6 (R2007a)
Processing C:\Program Files\MATLAB\R2007a\toolbox\matlab\mcc.enc
Processing C:\Program Files\MATLAB\R2007a\toolbox\database\mcc.enc
Processing include files...
2 item(s) added.
Processing directories installed with MCR...
The file D:\My Documents\MATLAB\untitled2\src\mccExcludedFiles.log contains a list of functions excluded from the CTF archive.
2 item(s) added.
Generating MATLAB path for the compiled application...
Created 37 path items.
Begin validation of MEX files: Sat Dec 15 09:15:20 2007
Validating 'C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deploywhich.mexw32'.
No conflicting M-file found.
Validating 'C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\readline.mexw32'.
No conflicting M-file found.
End validation of MEX files: Sat Dec 15 09:15:20 2007
Deleting 2 temporary MEX authorization files.
Removing: 'C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mathworks_tmp_329_3680.auth'.
Removing: 'C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mathworks_tmp_20312_3680.auth'.
Parsing file "D:\My Documents\MATLAB\drawplot.m"
     (Referenced from: "Compiler Command Line").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m"
     (Referenced from: "Compiler Command Line").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\compiler\dirname.m"
     (Referenced from: "Compiler Command Line").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m"
     (Referenced from: "Compiler Command Line").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\printdlg.m"
     (Referenced from: "Compiler Command Line").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\iofun\filesep.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\hgrc.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\codetools\initdesktoputils.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\local\initprefs.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\isdeployed.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\ispc.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\lang\lasterror.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\local\pathdef.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\pwd.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\recycle.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\local\reporterrorlogs.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\strfun\str2double.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\usejava.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\matlabrc.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\iofun\fileparts.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\dirname.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\timefun\datestr.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\graphics\getappdata.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\datatypes\isfield.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\uitools\msgbox.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\timefun\now.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\datatypes\num2cell.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\strfun\num2str.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\graphics\orient.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\graphics\print.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\strfun\str2num.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\iofun\tempname.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\deployprint.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\path.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\printdlg.m").
Parsing file "C:\Program Files\MATLAB\R2007a\toolbox\matlab\general\rmpath.m"
     (Referenced from: "C:\Program Files\MATLAB\R2007a\toolbox\compiler\deploy\printdlg.m").
Generating file "D:\My Documents\MATLAB\untitled2\src\untitled2\untitled2MCR.java".
Generating file "D:\My Documents\MATLAB\untitled2\src\untitled2\untitled2class.java".
Generating file "D:\My Documents\MATLAB\untitled2\src\readme.txt".
Executing command: ""c:\Program Files\java\bin\javac" -verbose -classpath "D:\My Documents\MATLAB\untitled2\src";"C:\Program Files\MATLAB\R2007a\toolbox\javabuilder\jar\javabuilder.jar" -d "D:\My Documents\MATLAB\untitled2\src\classes" "D:\My Documents\MATLAB\untitled2\src\untitled2\untitled2MCR.java" "D:\My Documents\MATLAB\untitled2\src\untitled2\untitled2class.java""
ϵͳÕÒ²»µ½Ö¸¶¨µÄ·¾¶¡£
Error: An error occurred while shelling out to javac (error code = 1).
Unable to build executable.
??? Error executing mcc, return status = 1.



There were errors during compilation process.

并且在文件夹distrib中没有任何东西!
请教是怎么回事!多谢!
mbuild -setup 设置里就有一个可以选择的,就选它了!
你在另一篇for .net中提到过要设置它的,怎么设置呢?
还有就是deployment tool settings是不是也要设置呢?我使用的是7.4版本的
不知道怎么设置,请教一下!
谢谢!!!
重在解决问题!多谢!
回复 不支持

使用道具 举报

 楼主| 发表于 2007-12-16 17:25:20 | 显示全部楼层 来自 新加坡
你的java 的JRE和JDK版本是多少。看起来上面的编译过程用的是:

  1. c:\Program Files\java\bin\javac
复制代码


这个javac是你自己安装的吗?他的版本是多少。然后再看看matlab帮助中关于matlab builder for java的内容,在文档的开始部分应该有关于javac的版本需求以及必要的安装方法。

Good luck!
回复 不支持

使用道具 举报

 楼主| 发表于 2007-12-17 21:43:32 | 显示全部楼层 来自 新加坡
不知楼上关于MATLAB Builder for Java的问题解决了没有。

怀疑是你的JRE,JDK版本以及JDK安装后的设置有关。

刚才在MATLAB R2007b中做了试验,参考MATLAB在线帮助后发现,MATLAB R2007b推荐使用java6,也就是java 1.6.x版本的。于是下载了最新版JAVA SE1.6.0.03,安装以后根据matlab的文档中提出的建议,设置JAVA_HOME环境变量,我是在matlab环境中试验的,也就是,在运行deploytool之前,先运行下面这行:

  1. setenv('JAVA_HOME', 'H:\Program Files\Java\jdk1.6.0_03');
复制代码

如果不运行这个,会出现类似于你上面提出的错误。

于是成功编译你上面提到的myadd例子。希望这些有助于你排错。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-12-18 17:27:09 | 显示全部楼层 来自 北京
谢谢LZ老师分享,LZ的方法已经测试成功
最近在做vc和matlab神经网络模块结合的程序,请问有什么需要注意的地方吗?

建议将
#include "mclmcr.h"
#include "mclcppclass.h"
改为
#include <mclmcr.h>
#include <mclcppclass.h>
回复 不支持

使用道具 举报

发表于 2008-1-10 21:41:51 | 显示全部楼层 来自 四川成都
taohe兄能否把使用vs2005+matlab7.5混编中,使用com形式和使用dll形式的不同之处,以及各自的优缺点做个介绍?谢谢。
回复 不支持

使用道具 举报

发表于 2008-1-23 13:12:59 | 显示全部楼层 来自 北京
拜读过您的文章《程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)》,您所说的是控制台的方法。我把它应用到MFC工程的时候,出现如下问题:
        // initialize lib
        if( !libmyadd2Initialize())
        {
                str+="Could not initialize libmyadd2!\r\n";
                edRes->SetWindowText(str);
                return;
        }
提示了“Could not initialize libmyadd2”。也就是libmyadd2Initialize返回了false。
我实在很苦恼,如果您有好的解决办法,请告诉我,不胜感激。
回复 不支持

使用道具 举报

发表于 2008-1-23 15:41:44 | 显示全部楼层 来自 北京
还有一个问题,请教一下:如何在没有安装过Matlab的机器上运行这个的程序呢?需要作哪些部署?
总是提示Could not initialize the application!。
要把Matlab的文件拷过去再一个个剥离开很晕啊,文件太碎了。
回复 不支持

使用道具 举报

发表于 2008-1-23 16:01:48 | 显示全部楼层 来自 北京

回复 31# 的帖子

Would you like mex to locate installed compilers [y]/n? _
只要选择n就可以看到其他编译器的列表了

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2008-3-1 23:28:22 | 显示全部楼层 来自 广东深圳
我也出现了同fspider 一样的问题~~~~
:Q :Q :Q
回复 不支持

使用道具 举报

发表于 2008-3-2 19:26:09 | 显示全部楼层 来自 广东深圳
我所有步骤按照楼主说的做,但到最后编译的时候出现这样的错误:
1>------ 已启动生成: 项目: testmyadd2_r2007b, 配置: Release Win32 ------
1>正在编译...
1>stdafx.cpp
1>正在编译...
1>testmyadd2_r2007b.cpp
1>E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(474) : warning C4793: “vararg”: 导致生成函数“mwArray mwArray::Get(mwSize,...)”的本机代码
1>        E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(465) : 参见“mwArray::Get”的声明
1>E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(484) : warning C4793: “vararg”: 导致生成函数“const mwArray mwArray::Get(mwSize,...) const”的本机代码
1>        E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(475) : 参见“mwArray::Get”的声明
1>E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(495) : warning C4793: “vararg”: 导致生成函数“mwArray mwArray::Get(const char *,mwSize,...)”的本机代码
1>        E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(485) : 参见“mwArray::Get”的声明
1>E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(506) : warning C4793: “vararg”: 导致生成函数“const mwArray mwArray::Get(const char *,mwSize,...) const”的本机代码
1>        E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(496) : 参见“mwArray::Get”的声明
1>E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(1491) : warning C4793: “vararg”: 导致生成函数“void mclcppMlfFeval(HMCRINSTANCE,const char *,int,int,int,...)”的本机代码
1>        E:\PGXP\MATLAB\R2007b\extern\include\mclcppclass.h(48) : 参见“mclcppMlfFeval”的声明
1>.\testmyadd2_r2007b.cpp(6) : fatal error C1083: 无法打开包括文件:“libmyadd2.h”: No such file or directory
1>AssemblyInfo.cpp
1>生成日志保存在“file://e:\我的文档\Visual Studio 2005\Projects\testmyadd2_r2007b\testmyadd2_r2007b\Release\BuildLog.htm”
1>testmyadd2_r2007b - 1 个错误,5 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

这是为什么呢?
回复 不支持

使用道具 举报

发表于 2008-3-16 19:32:54 | 显示全部楼层 来自 北京师范大学

郁闷

我编了一个m文件,用Vc6 + Matlat 7的MFC程序测试通过,但改到VS2005+MatlabR2007b中,编译通过了,但调试到
if(!libmyfuncInitialize()){...}时,程序就死了,不知是怎么回事,请高手指点指点!!不胜感激!!
回复 不支持

使用道具 举报

发表于 2008-4-5 21:56:18 | 显示全部楼层 来自 湖北武汉

好贴

好贴子,这几天正要使用MATLAB R2007B和VISUAL C++2005混编程序,要把M代码转到VC++2005工程中。你的帖子真是太好了。
谢谢楼主,谢谢。
回复 不支持

使用道具 举报

发表于 2008-4-6 08:42:34 | 显示全部楼层 来自 湖北武汉

回复 20# 的帖子

在DOS窗口执行,会提示找不到libmyadd2.lib库文件。而当把库文件复制过去后,程序的编译就会出错,会看不到结果了。
回复 不支持

使用道具 举报

发表于 2008-4-6 10:33:32 | 显示全部楼层 来自 湖北武汉

回复 23# 的帖子

这个请你看下Matlab说明文件,输入“mbuild -setup”后,选择N,然后选择7,然后选择Y,再确认路径就可以了。
回复 不支持

使用道具 举报

发表于 2008-6-2 20:50:08 | 显示全部楼层 来自 北京

能否,看一下代码,谢谢

GetDlgItemText(hwndDlg,IDC_EDIT2,NumBuffer,sizeof(NumBuffer));
                                        Length=atof(NumBuffer);
                                        GetDlgItemText(hwndDlg,IDC_EDIT3,NumBuffer,sizeof(NumBuffer));
                                        Hight=atof(NumBuffer);
                                        mclInitializeApplication(NULL,0);
                                        GuassInitialize();
                                        mwArray a(1, 1,  mxDOUBLE_CLASS,mxREAL);
                                        mwArray b(1, 1,  mxDOUBLE_CLASS,mxREAL);
                                        mwArray c(1, 1,  mxDOUBLE_CLASS,mxREAL);
                                        a(1,1)=Length;
                                        b(1,1)=Hight;
                                        Guass(1,c,a,b);
                                        double cResult;
                                        c.GetData (&cResult,1);       
                                        Result=c(1,1);
                                        GuassTerminate();
                                        mclTerminateApplication();
                                        Result=cResult/3.14159;

                                        sprintf_s(buffer,"%2.2f%%",Result);
                                        SetDlgItemText(hwndDlg,IDC_RESULT,buffer);
帮忙看一下代码,谢谢
这是VC调用matlab函数,先从对话框中获取矩形区域的高和宽,然后调用matlab计算高斯分布,在矩形区域中所占的比例,最后输出在对话框上,编译链接都没有错误,但是运行是出错。

m文件为
function z=Guass(a,b)
syms x y;
z=dblquad('exp(-x.^2-y.^2)',-a/2,a/2,-b/2,b/2);
end

谢谢了,goodmorningxr@126.com
回复 不支持

使用道具 举报

发表于 2008-8-5 04:19:31 | 显示全部楼层 来自 德国
原帖由 taohe 于 2007-10-24 19:10 发表
这个程序是个命令行程序,如果没有在VS2005的IDE中执行的话,最好开一个DOS窗口,进入程序所在目录,然后执行程序,这样就能看到运行结果,不要在Explorer中运行。


我把帖子里的程序按原样运行一遍(包含.dll的四个文件也和vc源程序在同一目录下),窗口也是一闪而过,能看出结果是对的。
但在dos命令下运行,提示unable to locate component This application has failed to start because libmyadd2.dll was not found. Re-installingthe application may fix this problem.

事实上,我直接去debug目录下运行testmyadd2_r2007b.exe时,也出现上述错误提示,无法运行
请问是什么原因?谢谢
我的matlab版本和visual studio 版本和楼主都是一样的,matlabr2007b V7.5版本,
VS2005
回复 不支持

使用道具 举报

发表于 2008-8-5 17:23:13 | 显示全部楼层 来自 德国
原帖由 axius 于 2008-8-5 04:19 发表


我把帖子里的程序按原样运行一遍(包含.dll的四个文件也和vc源程序在同一目录下),窗口也是一闪而过,能看出结果是对的。
但在dos命令下运行,提示unable to locate component ,This application has failed  ...

自问自答:
把mcc命令产生的 .dll and .ctf 文件拷到C:\ProgramFiles\Microsoft Visual Studio 8\Common7\IDE

还要把
C:\ProgramFiles\Microsoft Visual Studio 8\Common7\IDE; 加到environment variable 的path里面

这样就OK了.

再问一个问题, 楼主介绍时用
的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序
请问如果VC里面已经编好的主程序是Windows 图形界面程序,那么相应在设置和程序里要做哪些改动呢?

感谢
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 21:09 , Processed in 0.055094 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表