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

系统调用MATLAB DLL的基本要求(11-10问题)

[复制链接]
 楼主| 发表于 2009-9-22 14:16:38 | 显示全部楼层 来自 四川成都
在网友老虎的帮助下,在工控板上装了个XP系统试,结果仍然调用不成功。当然纯vc程序没有问题。他告诉我一般在XP上调不了DLL可以先注册一下,具体方法不清楚。一般注册后就可以了,现在libmatlb.dll libmx.dll几个在注册时出现找不到模块什么的。。。
我想问MATLAB的这些独立运行库是什么做的?同样X86系统为什么就不行呢?
回复 不支持

使用道具 举报

发表于 2009-9-22 17:57:07 | 显示全部楼层 来自 北京
Simdroid开发平台
阉割的XP,还是X86的MATLAB,够呛的。
与其这么折腾,还不如弃MATLAB而用开源的Scilab
回复 不支持

使用道具 举报

发表于 2009-9-23 07:34:59 | 显示全部楼层 来自 新加坡
在网友老虎的帮助下,在工控板上装了个XP系统试,结果仍然调用不成功。当然纯vc程序没有问题。他告诉我一般在XP上调不了DLL可以先注册一下,具体方法不清楚。一般注册后就可以了,现在libmatlb.dll libmx.dll几个在注 ...
guflei 发表于 2009-9-22 14:16


从你的帖子中没有看出你是怎么把调用matlab的dll的程序“搬”到XPE系统中的。你能否把你做过的主要步骤讲一下,包括对系统环境变量的设置等。如果是用matlab7.x的话,还有关于MCR的安装步骤,步骤中间是否有重启电脑等。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-23 09:33:50 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-23 09:39 编辑

好的,下面我来叙述一下大致操作步骤:
1.在MATLAB6.5里将编译器设置"mex -setup","mbuild -setup " 都是选择的VC编译器.
2.做了个函数

  1. function q = TEST(a)
  2. q = 1:a;
复制代码
3.在VC里建个MFC dll工程,用add-in将函数编译出来,再写个接口函数

  1. extern "C" __declspec(dllexport) void TEST(double *q,int *n)

  2. {
  3. AFX_MANAGE_STATE(AfxGetStaticModuleState());

  4. AfxMessageBox("In vc dll.");

  5. mwArray N(1,1,n);

  6. mwArray Q;

  7. Q = test(N);

  8. AfxMessageBox("Out matlab dll.");

  9. memcpy(q,mxGetPr(Q.GetData()),(*n)*sizeof(double));
  10. }
复制代码
VC++6.0 环境及工程设置完成,并添加了几个常用库:libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib

编译出DLL,LIB文件.
4.在VC里建个"HELLO WORLD"工程,显示前调用3步中的DLL,将返回得到的数据一并显示出来.

这个是为测试做的,我自己的程序仅仅是MATLAB里的函数更复杂些,调用的参数多一些而已,其他都一样.

把4步的EXE和3步的DLL,LIB文件与MATLAB的库打包到XPE平台,同个文件夹下执行EXE.出现错误.
回复 不支持

使用道具 举报

发表于 2009-9-23 10:23:09 | 显示全部楼层 来自 新加坡
在VC6工程设置中加入的连接库中的最后一个,也就是libmwservices.lib,似乎没有必要。上面的那个MFC DLL代码编译的时候没有错误信息吗?第8行的那个n是个int*,那哪里期望的应该是一个double*。整个程序在你编译的这台机子上运行正常吗?


另外,能否把最后一句,也就是
“把4步的EXE和3步的DLL,LIB文件与MATLAB的库打包到XPE平台,同个文件夹下执行EXE.出现错误.“
分开再详细一些,比如你说的”把matlab的库打包“,能否说明一下把那些东西打包了?以及路径名等。另外在xpe中的用户名是中文名吗?
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-23 10:30:33 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-23 10:36 编辑
  1. This is the output from running MATLAB Add-in.
  2. Please close this window after viewing it.
  3. --------------MCC/MEX BEGIN---------------
  4. mcc -k "E:\MyProjects\excise\TEST01_d\mcc.mak" -/n -t -L CPP -h -T link:exe -A linen -g libmmfile.mlib -vh "E:\MyProjects\excise\TEST01_d\TEST.m"
  5. Compiler version: 3.0
  6. Parsing file "e:\myprojects\excise\test01_d\test.m"
  7. (Referenced from: "Compiler Command Line").
  8. Generating file "test.hpp".
  9. Generating file "test.cpp".
  10. Executing command: mbuild -g -v -output "TEST" "test.cpp" -link exe -k "E:\MyProjects\excise\TEST01_d\mcc.mak" -no_mmfile -nohg -no_setup
  11. This is mbuild Copyright 1984-2002 The MathWorks, Inc.

  12. -> Default options filename found in C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R13
  13. ----------------------------------------------------------------
  14. -> Options file = C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R13\compopts.bat
  15. -> COMPILER = cl
  16. -> Compiler flags:
  17. COMPFLAGS = -c -Zp8 -G5 -W3 -nologo -Zm500 -GX -MD -I"C:\MATLAB6p5\extern\include\cpp" -DMSVC -DIBMPC -DMSWIND
  18. OPTIMFLAGS = -O2 -DNDEBUG
  19. DEBUGFLAGS = -Zi -Fd"TEST.pdb"
  20. arguments =
  21. Name switch = /Fo
  22. -> Pre-linking commands =
  23. -> LINKER = link
  24. -> Link directives:
  25. LINKFLAGS = kernel32.lib user32.lib gdi32.lib advapi32.lib oleaut32.lib ole32.lib /LIBPATH:"C:\MATLAB6p5\extern\lib\win32\microsoft\msvc60" libmatlb.lib /nologo libmx.lib libmat.lib libmwservices.lib libmex.lib libut.lib C:\MATLAB6p5\extern\lib\win32\libmatpm.lib
  26. LINKFLAGSPOST =
  27. Name directive = "/out:TEST.exe"
  28. File link directive =
  29. Lib. link directive =
  30. Rsp file indicator = @
  31. -> Resource Compiler = rc /fo ".res"
  32. -> Resource Linker =
  33. ----------------------------------------------------------------

  34. --------------MCC/MEX DONE----------------
复制代码
编译是通过了的。

程序在我的机器上运行正常。

matlab的库是指:mglinstaller.exe解出来的bin文件。

路径比较随意,因为在标准XP系统上(未装matlab)都能运行,所以直接在C盘下的文件夹里,用户名默认:administrator.
回复 不支持

使用道具 举报

发表于 2009-9-23 10:41:48 | 显示全部楼层 来自 新加坡
This is the output from running MATLAB Add-in.
Please close this window after viewing it.
--------------MCC/MEX BEGIN---------------
mcc -k "E:\MyProjects\excise\TEST01_d\mcc.mak" -/n -t -L CPP -h  ...
guflei 发表于 2009-9-23 10:30


有没有试过在XPE上运行mglinstaller.exe,也就是以正规的方式发布你的程序?另外,在XPE系统上,环境变量“temp”和“tmp”是什么?在dos窗口运行"set path"的结果是什么?
回复 不支持

使用道具 举报

发表于 2009-9-23 10:50:24 | 显示全部楼层 来自 新加坡
不好意思,看走眼了,仔细看了一下你给出的上面那个mcc的log信息,看来你是从那个matlab函数编译产生了一个test.exe,而不是一个dll,是这样的吗?那你在那个MFC DLL的代码中是怎么调用matlab编译后的代码的?最好把对matlab的数学库等的初始化代码贴出来看看。也就是你在25楼给出的第3
步中调用编译后的matlab代码需要做的一些初始化代码。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-23 11:17:36 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-23 11:26 编辑

刚刚忙着去看环境变量,才发现XPE裁得太小了,都不支持“我的电脑”右键。
您说的产生test.exe我想有误,我的工程是MFC dll 所以是通过matlab函数编译产生C++,H++文件后再在vc里写了第3步的初始化数据和调用函数
  1. extern "C" __declspec(dllexport) void TEST(double *q,int *n)
复制代码

编译VC 产生dll,lib 文件。这个就是我说的把matlab函数封装成MFC dll.
最后在用个可执行文件来调用它。

您说的初始化代码就是我25楼贴出的第3步。
回复 不支持

使用道具 举报

发表于 2009-9-23 11:25:12 | 显示全部楼层 来自 新加坡
看来可以先告一段落,我的理解是,matlab以及包含matlab经过编译后的DLL等,没有什么特别的硬件方面的要求,只要是个x86架构的硬件环境,如果能运行Windows,它们就能够运行,缺的可能是类似于环境变量设置等小问题了,当然需要细心。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-23 11:47:31 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-23 11:49 编辑

所以您说的环境变量需要怎么设置呢?大致的方向。
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-23 16:16:47 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-23 16:49 编辑

我在现在的工控主板上挂了个硬盘,装上完整版XP,在我的PC上安装VC++ 6.0,MATLAB,再将盘挂到工控主板上。在我的本地,VC 和MATLAB运行正常。移过去后,运行MATLAB出现下面的文字和对话框。

  1. ------------------------------------------------------------------------
  2.         Illegal instruction detected at Thu Jan 02 06:09:04 2003
  3. ------------------------------------------------------------------------

  4. Configuration:
  5.   MATLAB Version:   6.5.0.180913a (R13)
  6.   Operating System: Microsoft Windows XP
  7.   Window System:    Version 5.1 (Build 2600: Service Pack 3)
  8.   Processor ID:     x86 Family 5 Model 10 Stepping 2, AuthenticAMD
  9.   Virtual Machine:  Java 1.3.1_01 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
  10.     (mixed mode)

  11. Register State:
  12.   EAX = 00000100  EBX = 1410ce38
  13.   ECX = 1410ce00  EDX = 7a0dd318
  14.   ESI = 7a0dd328  EDI = 00000000
  15.   EBP = 00dfdd28  ESP = 00dfdd10
  16.   EIP = 7a09ec7b  FLG = 00010246

  17. Stack Trace:
  18.   [0] hg.dll:_bind_handle_in_table(0x7a0dd318, 0, 0x3f200000, 0x1410ce38) + 43 bytes
  19.   [1] hg.dll:_bind_integer_handle_in_table(0x7a0dd328, 0x1410ce38, 0, 0x014d1088) + 105 bytes
  20.   [2] hg.dll:_assign_figure_handle(0x1410ce38, 0, 0x1410ce38, 23) + 48 bytes
  21.   [3] hg.dll:_create_root_object(4194304, 0, 271244, 1) + 197 bytes
  22.   [4] matlab.exe:_WinMainCRTStartup(3276852, 3342386, 0x7ffde000, 0x8054c6b8) + 308 bytes
  23.   [5] kernel32.dll:0x7c817067(0x0047172c, 0, 0, 0)

  24. Please follow these steps in reporting this problem to The MathWorks so
  25. that we have the best chance of correcting it:

  26.   1. Send this crash report to segv@mathworks.com for automated analysis.
  27.      For your convenience, this information has been recorded in:
  28.        C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\matlab_crash_dump.464

  29.   2. Also, if the problem is reproducible, send the crash report to
  30.      support@mathworks.com along with:
  31.        - A specific list of steps that will reproduce the problem
  32.        - Any M, MEX, MDL or other files required to reproduce the problem
  33.        - Any error messages displayed prior to this crash report
  34.      A technical support engineer will contact you with further information.

  35. Thank you for your assistance.  Please save your workspace and restart
  36. MATLAB before continuing your work.
复制代码


由于我在VC的定制里也选了add-in MATLAB 所以打开VC后也会有这个对话框

上图也是在打开vc后出现的,不知道有没有遇到类似问题的朋友。这些现象是否能够弥补?
由于是盗版MATLAB都不好意思找mathworks。:L
回复 不支持

使用道具 举报

发表于 2009-9-23 20:48:19 | 显示全部楼层 来自 新加坡
我在现在的工控主板上挂了个硬盘,装上完整版XP,在我的PC上安装VC++ 6.0,MATLAB,再将盘挂到工控主板上。在我的本地,VC 和MATLAB运行正常。移过去后,运行MATLAB出现下面的文字和对话框。
--------------------- ...
guflei 发表于 2009-9-23 16:16


你是说在工控版上挂个硬盘,装上完整的WindowsXP,然后又把该硬盘挂到自己的电脑上安装VC及matlab,最后把该硬盘再挂到工控机上去运行matlab,是这样的吗?我有点流汗了,你觉得这样应该能工作呢还是不能工作呢?我觉得悬。这样的测试对于你当初的问题似乎没有帮助,反而把水变得更浑了。

要是把重点放在XPE的创建上,比如清楚类似于“我的电脑出不来”那样的和嵌入式系统的定制有关的问题,使得自己有一个可以信赖的XPE,然后再着重研究为什么matlab编译后的DLL无法在XPE中调用的问题,可能更好一些。一点拙见。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-24 08:23:37 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-24 08:30 编辑

感谢taohe兄关注。
XPE就是XP的部分版,由于我已经裁了不少版本的XPE了,始终未能得到理想可靠的XPE,所以只有弄个完整版。昨天装上那两个软件后发现确实在装了matab时可能存在问题,因为我是在我的PC上mex 和mbuild的。在工控板上就出现MCC的错误。所以今天我准备在工控平台上来装matlab再看看效果。
昨天的实验弹出的错误和之前独立运行时不同,独立运行时就是我1楼的错误,“非法程序什么的”,昨天的有点象vc调试错误对话框什么“终止,调试,取消”。我想是否是实验背景还有区别?
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-24 16:42:33 | 显示全部楼层 来自 四川成都
在工控板XP系统上安装了matlab,安装过程正常。重起后仍然出现上述情况。:(
看来硬件可能性较大,因为我已经试了三家公司的同款芯片组的板子了。情况一样。下一步准备换硬件再试了。
回复 不支持

使用道具 举报

发表于 2009-9-24 19:02:32 | 显示全部楼层 来自 广西贵港
这个帖子真是让人干着急,我们没法实验XPE:lol
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-25 10:54:08 | 显示全部楼层 来自 四川成都
本帖最后由 guflei 于 2009-9-25 10:56 编辑

硬件也换了,是个比现在工控板还老的,用的是VIA cpu芯片组,条件一样,结果调用可以成功。其中一家工控板供应商已经明确说了,是AMD LX700不支持指令集。只针对低端程序的应用。:funk:
世界上的事情那么多,怎么我就偏偏遇得到呢???
现在换板子或改软件应该是定了。想象一下,要把一两百行的矩阵运算翻译成C 代码是什么概念啊!替我悲哀吧!
以后有朋友要用matlab到特殊平台,一定要先测试啊,不要像我程序都出来了,才发现用不了。:'(

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-9-25 11:50:03 | 显示全部楼层 来自 重庆
终于看到结果了,似乎是AMD的原因。
其实,AMD市场份额不到 20% ...........
回复 不支持

使用道具 举报

 楼主| 发表于 2009-9-25 14:05:04 | 显示全部楼层 来自 四川成都
终于看到结果了,似乎是AMD的原因。
其实,AMD市场份额不到 20% ...........
风天小畜 发表于 2009-9-25 11:50

在工业行业也是AMD 和INTEL 不过低功耗它的还挺多。我遇到的就是现在工控非常普遍的一款。
回复 不支持

使用道具 举报

发表于 2009-9-25 16:29:12 | 显示全部楼层 来自 广西贵港
也不算特难
一两百行的矩阵运算翻译成C 代码是什么概念啊
guflei 发表于 2009-9-25 10:54
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 23:03 , Processed in 0.050044 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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