找回密码
 注册
Simdroid-非首页
查看: 123|回复: 1

仿真论坛MATLAB 版 FAQ Beta —— H. 混合编程

  [复制链接]
发表于 2011-6-18 20:14:00 | 显示全部楼层 |阅读模式 来自 黑龙江哈尔滨
本帖最后由 messenger 于 2011-6-18 20:23 编辑

H. 混合编程
H1  混合编程时,Matlab的哪些命令不能被调用?
      H2  明明安装了Visual Studio 2005,为什么mex就是找不到?
      H3  VC调用MATLAB C++库时,包含"matlab.hpp",为何找不到'strstream.h'?
      H4   MATLAB7.x + VC混合编程为什么提示找不到matlab.hpp?
      H5  在VC6.0 + Matlab R2009b联合编程时,编译成exe文件后,执行exe文件的时候为什么遇到如下错误:MATLAB:I18n:MissingICUData - ICU data not found. The program '[1672] F:\***.exe: Native' has exited with code 2 (0x2).?
      H6  MATLAB和VC混合编程为什么提示无法打开libmatpm.lib?
      H7  在win7中的MATLAB2009b中,找不到libmx.lib libeng.lib?
      H8  VC调用MATLAB生成的图片时,为何图片显示时却一闪而过?
      H9  MFC调用matalab的dll进行画图时,为什么执行的时候,有一个窗口闪过却画不出来图形?
      H10  在通过Matlab调用Fortran程序时,为什么在链接时会有如下错误信息 :mexfile_CaclT90.obj : error LNK2001: unresolved external symbol _MEXERRMSGTXT@8
      H11  在编写mexw32文件时,用什么函数来实现从matlab传递来一个字符串参数?
      H12  VC++如何调用matlab中的绘图命令?
      H13  如何发布MATLAB7.X编译后的程序?
      H14 Matlab2010b+VC6.0混编
      H15 Matlab如何输出dxf格式的图形?


 楼主| 发表于 2011-6-18 20:19:13 | 显示全部楼层 来自 广东广州
Simdroid开发平台
本帖最后由 messenger 于 2011-6-18 20:21 编辑

H1    
Q:混合编程时,Matlab的哪些命令不能被调用?   
A:
   混合编程不支持符号计算命令,syms、tf、神经网络工具箱所有函数
   参考链接:http://forum.simwe.com/thread-884747-1-1.html

H2   
Q:明明安装了Visual Studio 2005,为什么mex就是找不到?   
A:
      这是因为mex检查你是否安装了VS,进一步查看版本是否正确,是通过查看C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe的版本是否正确。具体方法是调用cl.exe,它会输出一堆字符,然后在其中查看是否有“Version 14.0”,如果有就判断版本正确,否则就会出现上面的一堆Error。但是非英文版的VS,调用cl.exe输出的字符中不一定有“Version 14.0”,这就会导致mex误判。
     参考链接:http://forum.simwe.com/thread-881899-1-1.html

H3   
Q:VC调用MATLAB C++库时,包含"matlab.hpp",为何找不到'strstream.h'?   
A:
      引自taohe
      
      strstream.h是一个旧版标准的c++头文件。vc把它改成了strstrea.h,这两个头文件名相差一个m。在vc里用标准的strstream.h是找不到的。那么你在vc里边以为什么要找strstream.h呢?那是因为你的程序不知道你在用著名的vc,而其他多数c++编译器是用标准的头文件名。
      你可能注意到了,新版的C++(不光是vc++,这里指C++标准)规定所有的标准头文件不带后缀,也就是说头文件名不再有".h"。但几乎所有的C++编译器为了照顾其客户手中的一些旧代码,一般都提供有".h"的头文件。微软的vc在strstream这个头文件上比较特殊,其旧版的头文件名叫做strstrea.h,而新版的则和标准一样,叫做strstream。所以你可能已经在你的vc的安装目录下找到一个文件叫做strstream了,但是可惜的是,你不能把这个文件改个名,改成strstream.h来用,因为新版的头文件中的定义都用到了叫做"std"的namespace。要像使用新版的头文件,需要用不同于旧版的方法。
       以上有点扯远了。不过也算是一点背景知识吧。现在再来看你的问题,我猜99%你的mcc没有问题,只是你的vc还没有设置好。而如何设置vc这里已经讨论过很多了。其中一点就是要在编译之前定义MSVC之类的。意思就是说,设置好vc以后,你不用修改原文件,同样的文件,在vc不会再有问题,他也不会再说找不到strstream.h了。Good luck!
      
个人意见:
       请注意VC的工程选择。
       参考MATLAB目录下\extern\examples的相关目录的readme
       据我所知,在MFC AppWizard及Win32 Console Application中是可以使用MATLAB C++数学库的
       参考
       请教~用mcc命令把M文件生成C++文件后却编译不成功~
       【求助】在VC中包含"Matlab.hpp"编译时在所有路径都找不到"strstream.h
       【求助】VC扩展编程
       【讨论】strstream.h是什么头文件哪
       【讨论】关于Matlab与VC接口的新疑问

H4   
Q:MATLAB7.x混合编程为什么提示找不到matlab.hpp?   
A:
      MATLAB从7.0开始,编译器发生了重大的变革。不再提供C/C++数学图形库,不再有类于matlab.hpp的头文件了
      参考
      MatLab 7 如何在vc中调用?好像少了matlab.hpp
      【原创】VC6.0调用Matlab6.5数学库函数和图形库函数编程实例

H5
Q:在VC6.0 + Matlab R2009b联合编程时,编译成exe文件后,执行exe文件的时候为什么遇到如下错误:MATLAB:I18n:MissingICUData - ICU data not found. The program '[1672] F:\***.exe: Native' has exited with code 2 (0x2).
A:
   出现这种错误的原因很多,有可能是因为缺少需要加入的链接库。
   参考链接:VC Matlab联合编程遇到Runtime Error



H6    
Q:VC和MATLAB混编为什么提示无法打开libmatpm.lib?   
A:
   阅读如下关于MATLAB6.X混编的帖子,及相关精华区SCIE的帖子
   【转帖】总结:m文件转化为c/c++语言文件,VC编译

H7
Q:在win7中的MATLAB2009b中,找不到libmx.lib libeng.lib?
原来在vs2005下写的程序,调用maltab2007a的engine实现画图,运行没有问题。最近用vs2008和matlab2009b,对同样的程序,编译成功,但运行失败,提示libmx.dll或者libeng.dll等文件找不到或者已损坏,建议重装程序。路径设置和包含文件设置都没有问题,而且libmx.dll和libeng.dll等确实都存在。
完整的信息显示是:
“无法启动程序,因为计算机中丢失libmx.dll。尝试重新安装该程序以解决此问题。”

A:
原因是环境变量的设置出现问题了。在win7下,需要在系统变量和用户变量的path中均添加所需路径。在matlab安装时只设置了系统变量的path,没有设置用户变量的path,需自己添加。
   参考链接:MATLAB2009b中libmx.lib libeng.lib找不到
                    混合编程找不到libmx.lib libeng.lib?
                     How can I use Microsoft Visual C++ 2010 to create MEX files with MATLAB 7.10 (R2010a)?

H8    
Q:VC调用MATLAB生成的图片时,为何图片显示时却一闪而过?   
A:
   这是因为初始化和终止代码放错了地方。
   参考链接:vc调用matlab生成图片却只是一闪而过!(附源程序)已解决


H9    
Q:MFC调用matalab的dll进行画图时,为什么执行的时候,有一个窗口闪过却画不出来图形?   
A:
   MFC调用matalab的dll进行画图时,有一个窗口闪过,然后就没了。然后重新执行,就会出现初始化错误提示!但执行win32控制台程序是成功的。
   这是因为程序在执行过程中的确画出图了,可是关掉的太快了(通过调用libhuatuTerminate())。
   解决的方法是:把对我们的DLL库的初始化和关闭分别放到程序别的地方,不要放到按钮响应函数里,通常可以吧初始化代码放到 OnInitialDialog或者其他合适的地方,而把关闭库的代码放到OnClose或者其他合适的地方,这样按钮的响应函数只做画图,这样也显得有点条理。
   参考链接:mfc 调用matalab的dll进行画图时,出不来图形

H10
Q:在通过Matlab调用Fortran程序时,为什么在链接时会有如下错误信息:mexfile_CaclT90.obj : error LNK2001: unresolved external symbol _MEXERRMSGTXT@8
A:
   这种情况,是在因为在Fortran的project设置中,少加了一个libmex.lib库。
   参考链接:matlab与fortran的接口问题!

H11   
Q:在编写mexw32文件时,用什么函数来实现从matlab传递来一个字符串参数?   
A:
   可以用mxGetString或meArrayToString函数。
   参考链接:http://forum.simwe.com/thread-902638-1-2.html

H12   
Q:VC++如何调用matlab中的绘图命令?   
A:
   1、自己写个surf,mesh的命令,用mcc编译,看源代码;
   2、extern\include文件夹搜索。
   参考链接:http://forum.simwe.com/thread-904401-1-2.html


H13   
Q:如何发布MATLAB7.X编译后的程序?   
A:ZZ TAOHE的<深入浅出MATLAB7.X混合编程>
无论编译后产生的是可执行文件,还是动态连接库,要使它们能够发布到别的没有安装MATLAB的计算机上使用,必须在目标计算机上安装MCR,不能只是简单地把编译后产生的文件复制到目标计算机上。
可以利用MATLAB命令buildmcr来创建可以发布给最终用户的MCR安装文件。buildmcr的功能是创建一个包含MCR需要的所有文件的ZIP压缩文件。buildmcr有如下两种调用方式:

zipfile = buildmcr
zipfile = buildmcr(dirname)

其中返回值zipfile是产生MCRInstaller.zip的完整路径名。在没有输入参数的情况下,buildmcr会把产生的
MCRInstaller.zip保存到地址$MATLAB/toolbox/compiler/deploy/<arch>
/MCRInstaller.zip。

其中$MATLAB代表MATLAB的安装目录,<arch>代表不同的计算机架构。比如在Windows上,默认的
MCRInstaller.zip的路径为$MATLAB\toolbox\compiler\deploy\win32\
MCRInstaller.zip。

相应地,在Linux上,默认的MCRInstaller.zip的路径为$MATLAB/toolbox/compiler/ deploy/glnx86/MCRInstaller.zip。
也可以使用输入参数dirname来指定MCRInstaller.zip的保存目录。buildmcr('.')将把产生的MCRInstaller.zip保存到当前工作目录。
一般来说,需要发布的文件有3个:

(1)编译得到的可执行文件或者库函数。
(2)CTF文件。
(3)MCRInstaller.zip。

在最终用户的计算机上,首先需要把MCRInstaller.zip解压,并把MCR中可执行文件所在目录加到系统路径上,然后就可以使用编译后的程序了。
注意:MCR不支持在startup.m中使用addpath命令增加搜索路径。
startup.m是一个可以让用户设置一些关于MATLAB运行的个性化设置。如果你在运行MATLAB编译器的计算机上使用startup.m来给
MATLAB增加一些特别的搜索路径,那么发布的程序运行时会报错。必须让addpath命令只在非发布情况下才有效。利用isdeployed命令,在
startup.m判断是否运行相关的命令:

if ~isdeployed
             addpath(…)
             %其他一些命令
endif

另外,编译后发布的程序在运行时需要先把CTF解压。所以在运行这些程序时需要确保对CTF文件所在目录有写权利。否则,发布的程序在执行时会报错。如果编译后的程序以光盘的方式发布,那么程序必须先复制到硬盘的某个目录,然后才运行。



H14  
Q:Matlab2010b+VC6.0混编实现
A:
请参照rocwoods帖子:http://forum.simwe.com/thread-949201-1-1.html


H15   
Q:Matlab如何输出dxf格式的图形?   
A:
   可以调fortran生成。
   参考链接:请问,matlab如何输出dxf格式的图形?
                    fortran生成dxf接口库
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-6 11:33 , Processed in 0.035401 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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