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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【原创】程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)(页 1) - H01:MatLab - SimWe仿真论坛---(论坛实行邀请码注册) ||仿真|设计|有限元|虚拟仪器 - Powered by Discuz! ArchiverSimWe仿真论坛---(论坛实行邀请码注册)'s
Archiver
SimWe仿真论坛---(论坛实行邀请码注册) » H01:MatLab » 【原创】程序中使用MATLAB编译产生的DLL (VS2005,
MATLAB7.5, mwArray)taohe 发表于 2007-10-6 22:51
【原创】程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)
最近有几个帖子都在讨论有关在C++程序中使用MATLAB编译产生的动态链接库DLL。本来想用原来帖子中给出的m代码作为例子,无奈那段代码其实无法执行。为了避免分散注意力,也为了更好地讨论问题,于是决定还是另外新开一个主题,以简单的例子,和大家一起讨论如何在C++程序中使用matlab编译产生的DLL。

同时MATLAB最新版本R2007b刚刚发布不久,其中包含编译器4.7版,有了一些新的特性,于是也借这个例子来验证一下相关的技术有没有发生大的变化。

最近讨论的问题是关于在C++程序中调用MATLAB编译产生的动态链接库。具体的问题是在调用DLL中函数时传递参数。我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。论坛上的问题是关于调用C++接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。所以问题归结为[b]如何在C++程序中使用mwArray[/b]。

这个问题本来可以只用一个简单的C++程序来练习,而不需要MATLAB编译的DLL。不过为了模拟实际情况,选择以一个更为接近实际的m代码作为例子。在这个例子中,输入输出都是矩阵,至于标量,它也是一个一行、一列的矩阵。

实验环境:Windows 2003 Std Server with SP2 (En),MATLAB R2007b,Visual Studio
2005。MATLAB安装路径:h:\MATLABR2007b。

实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32
Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

下面是这个例子用到的m代码。它定义了一个名为myadd2的函数:[code]function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end[/code]首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild
-setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:
[code]mcc -W cpplib:libmyadd2 -T link:lib myadd2[/code]

结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。

接下来我们只需要这四个文件。[color=Blue]请注意:在MATLAB
R2007b之前,这些文件都会在和编译
的m代码所在的目录中,而在MATLAB R2007b,缺省情况下这些文件会在Documents and Settings中用户的My
Documents目录中[/color]。

此时,打开libmyadd2.h看看,在文件的最下面我们可以发现C++接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出参数、以及输入参数。

然后在VS2005中创建一个Win32
Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。

接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。如图所示:

[[i] 本帖最后由 taohe 于 2007-10-7 08:31 编辑 [/i]]
taohe 发表于 2007-10-6 22:53
然后把相应的lib所在目录加到linker的额外搜索路径上。如图所示:
taohe 发表于 2007-10-6 22:54
接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开。如图所示:
taohe 发表于 2007-10-6 22:55
最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。欢迎大家拍砖。谢谢![code]#include "stdafx.h"

#include
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"


int _tmain(int argc, _TCHAR* argv[])
{

std::cout << "Hello world!" << std::endl;
/* Initialize the MCR */
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" <<
std::endl;
return -1;
}

// initialize lib
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}

try
{
// declare and initialize a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData;
aData = new double[4];
int i;
for( i=0; i<4; ++i)
{
aData[i] = 1.0*i;
}
// print output
std::cout << "a = " << std::endl;
std::cout << aData[0] << ",\t" << aData[1] << std::endl;
std::cout << aData[2] << ",\t" << aData[3] << std::endl;

a.SetData(aData, 4);

// declare and initialize b

mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;

mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);

// call the function
myadd2(2, y, z, a, b);

// copy data from mwArray to C++ objects

// allocate outputs
double *yData, *zData;
yData = new double[4];
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" <<
std::endl;
return -1;
}

zData = new double[4];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" <<
std::endl;
return -1;
}

// copy data from mwArray to C++
y.GetData(yData, 4);
z.GetData(zData, 4);

// print output
std::cout << "y = " << std::endl;
std::cout << yData[0] << ",\t" << yData[1] << std::endl;
std::cout << yData[2] << ",\t" << yData[3] << std::endl;

std::cout << "z = " << std::endl;
std::cout << zData[0] << ",\t" << zData[1] << std::endl;
std::cout << zData[2] << ",\t" << zData[3] << std::endl;


// deallocate memory
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;

}
// terminate the lib
libmyadd2Terminate();

// terminate MCR
mclTerminateApplication();


return 0;
}[/code]

[[i] 本帖最后由 taohe 于 2007-10-6 23:18 编辑 [/i]]
taohe 发表于 2007-10-6 23:02
实验的结果表明,在C++程序中使用MATLAB编译产生的C++接口DLL非常容易。mwArray也很容易使用。另外,最新的MATLAB
R2007b中关于这部分并没有什么大的变化。这个练习适合MATLAB 7.0以后直到MATLAB R2007b的所有版本。
shunfly 发表于 2007-10-7 09:15
就我个人6.5混编的经验
我很少弄DLL
直接编译M文件为cpp,h文件即可
VC工程中引用,按.h文件格式调用即可
这样混编基本没有任何难度,将MATLAB程序看成MFC一个类即可,看看extern里面
相关头文件的定义,跟看MSDN一样。
抛开mclTerminateApplication();这些,这应该是一个通用的办法
手头只有6.5,不知道7.5还能生成cpp么?
taohe 发表于 2007-10-7 12:03
从matlab7.0开始,其编译器的功能就和以前版本不一样了。它不再把m代码翻译成C/C++源代码,而是对m代码作个简单的wrapper,通常以动态链接库的形式提供给用户以方便用户在其他的程序中使用。所以,在matlab
7.x,编译m代码不能得到以前那种意义的C/C++源程序。

不过,仅从软件开发的角度来看,我觉得用DLL来打包更为方便。如果m函数

的接口不变,那么每次改变m代码后,我们只需重新编译m代码,获得新的DLL及CTF,而不需要重新编译VC客户程序。这在开发大型软件时有很大的优越性。
shunfly 发表于 2007-10-7 12:26

这个我欠考虑了
不过,从软件开发角度说,7.X混编实在太庞大
我都成了6.X混编的遗老遗少:lol
taohe 发表于 2007-10-7 15:22
呵呵,要与时并进呀。新版的matlab有可能带给我们好的技术,比如matlabR2007b中的多线程计算,就是个好例子。现在多核电脑在个人电脑上也很普遍了,使用新版的matlab的多线程计算,就能很好的利用这些新的硬件从而获得更好的计算性能。

有些技术,在刚出来的时候可能是最好的,不过可能会随着时间的推移,而被淘汰。matcom就是个例子,其实我当初用过matcom而且也挺喜欢他的,而且那时也刚开始学习VC。所以二者结合后给我的感觉很好。只可惜,matcom已经成为历史。现在有时看见有人在找matcom,都不知道说什么好。

不过,我也是挺喜欢恋旧的。我电脑上还有matlab6.5.1。感觉那版很不错。VC6.0也不错,虽然那是差不多十年以前的产品,到现在还是必装软件之一。

好像有点扯远了。其实我想说的是:没有必要总是更新工具软件。如果已经是老用户,而且手中的旧版本能满足要求,或者没有必要的理由,就不用换;反之,如果刚开始学习使用某个软件,不妨从最新版开始。
shunfly 发表于 2007-10-7 18:49
最后跑次题:我先学混编,再学VC
鼓捣了一段VC/MATLAB混编
最近放弃了,自己写了个类似于MATLAB AXES的VC绘图类
语法,功能,完全类似MATLAB
所以,基本远离了MATLAB混编
daoxiangcun2002 发表于 2007-10-10 20:57
多谢taohe的文章,我想问一下,ctf文件是干嘛用的,谢谢,记得matlab 6.5版里面编译为DLL时没这个东西啊。
taohe 发表于 2007-10-10 21:14
[quote]原帖由 [i]daoxiangcun2002[/i] 于 2007-10-10 20:57 发表
[url=/forum/redirect.php?goto=findpost&pid=1158250&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
多谢taohe的文章,我想问一下,ctf文件是干嘛用的,谢谢,记得matlab 6.5版里面编译为DLL时没这个东西啊。 [/quote]

这是matlab7.0以后matlab编译器的新特性。它和旧版技术不兼容。ctf其实就是一个zip文件,其中包含加密或者说编码过的一些m代码。其中有你自己的代码,以及matlab编译器通过分析你的代码根据依赖关系找到的其他一些m代码。
daoxiangcun2002 发表于 2007-10-18 17:27
还有一个问题,可能也有些朋友都遇见过,还请taohe和版主等各位牛人解释一下,就是matlab 6.5和7.0是不兼容的,如果一台计算机上面同时装了matlab
6.5和7.0的话,那么我要用7.0将m文件编译

为dll的话,能够不出问题吗?
我最初的时候为了解决一个问题是想将m文件编译为c文件,这个想法是在看过邓科的那几篇关于matlab与VC混合编程的文章之后产生的,起初装了一个matlab
7.0但是编译不出来,后来换成6.5才行.所以就产生了这个问题,如果matlab
6.5和7.0同时存在一台计算机上面的话,我们应该注意些什么?可能会产生什么样的问题?
我也是看了刚才taohe的帖子才有这个想法的,还请taohe和大家给解释一下,谢谢!
taohe 发表于 2007-10-19 22:44
我现在同时安装了6.5.1,r2006b,r2007b。在使用某个版本时,我把另外几个版本的安装目录改名。比如r2006b安装在h:\matlabr2006b,不用的时候我把它改成h:\matlabr2006bxxx
daoxiangcun2002 发表于 2007-10-21 21:50
多谢taohe,我原来装了matlab
6.5(R13),现又装了7.0(R14),发现如果只有matlab7.0的话,调用matlab编译后的dll是可以的,就像你给的例子一样(在别人的计算机上试的),如果同时装了两个,即使把matlab6.5所在的文件夹改名,VC6.0里面编译运行时还是出现错误,说是“找不到mclmcrrt71.dll",不知道怎么回事,可能同时装多个版本容易出问题吧。
另外,我近几天看了一些matlab网站上的support
documentation,发现matlab的版本经常有一些奇怪的变动,比如comtool这个命令在7.5(R2007b)中变成了deploytool,还有matlab
builder for com 变成了matalb builder for
.NET,看来以后要多与新版本接轨了,不然很多新的功能都不知道,比如说deploy这个打包功能,在7.0里面就没有。
onfooter 发表于 2007-10-24 11:36
老师同学,您好我按您的步骤编译错误如下:
fatal error C1083: Cannot open include file: 'mclmcr.h': No such file or
directory
这个类mwArray在哪声明的呢?
mclmcr.h 和 "mclcppclass.h" 不是已经包含于libmyadd2.h了吗?
为什么还包含一次啊?
而且这两个是干吗的 在哪呢?
谢谢!
onfooter 发表于 2007-10-24 12:02
老师同学 我刚刚找了找
我的mclmcr.h 和 "mclcppclass.h" 在C:\MATLABR2007b\extern\include少了个win32 子目录
去掉之后 就行了
黑窗口闪了一下就没有了
好像
a的值是
0 1
2 3
后面的看不清 都不一样
结果和你的也不一样
我看来还没有理解
taohe 发表于 2007-10-24 19:10
这个程序是个命令行程序,如果没有在VS2005的IDE中执行的话,最好开一个DOS窗口,进入程序所在目录,然后执行程序,这样就能看到运行结果,不要在Explorer中运行。
柚籽 发表于 2007-11-4 16:22
很感谢楼主的分享~!我正在学习这方面的知识。
我按照您提供的步骤执行下来,遇到一些问题
事件1、在输入命令mbuild -setup之后,Select a compiler: 的选项只有1,第二个选项是none。
事件2 、如果我直接执行mcc -W cpplib:libmyadd2 -T link:l

ib myadd2 时,会报错。
matlab说编译cpp文件出错,在工作目录下只能得到libmyadd2.ctf,libmyadd2.h文件,而没有libmyadd2.lib,libmyadd2.dll文件。
部分错误代码:
Error libmyadd2.cpp: 112 missing parameter type
Error libmyadd2.cpp: 112 skipping `&' `y' `,' `mwArray' `&' `z' `,'
……
Error libmyadd2.cpp: 116 syntax error; found `end of input' expecting `}'
17 errors, 3 warnings

E:\MATLAB71\BIN\WIN32\\..\MEX.PL: Error: Compile of 'libmyadd2.cpp' failed.

事件3、当我执行mcc -l myadd2 ,则不会报错,而且会生成所有的文件。但是我在vc2005里调试的时候,则会报错,说我调用的函数 myadd2
没有定义。
我去myadd2.h里查看时,
bool myadd2InitializeWithHandlers
bool myadd2Initialize(void);
void myadd2Terminate(void);都有声明。
但是我自己的myadd2的声明变成了
……
void mlxMyadd2(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
extern LIB_myadd2_C_API
void mlfMyadd2(int nargout, mxArray** y, mxArray** z
, mxArray* a, mxArray* b);
……
我把main函数里的函数名改成上面的任意一个都没用,因为都会报参数错误。
-----------------------------------------------------------------
问题1:同样的步骤为什么结果不同,请问我这里是哪里出了问题?是因为我mbuild -setup命令后没有出现vc++的选项而引起的错误吗?是否我少装了什么呢?
问题2:我看help也没看懂-l和-w有什么大的不同。。为什么用另外一个命令编译,得到同样类型的文件,而myadd2传的参数就不同了。
问题3:百度了一下mxArray和mwArray的区别,只知道是不同的数据类型,具体也没太明白。
是不是mwArray是C++的接口对象,而mxArray或许是C的接口对象?(-l命令编译了c接口文件?)

现在不是很清楚这里的编译问题,有很多疑惑,看了help也不是很明白,感谢帮助!
柚籽 发表于 2007-11-4 17:35
cpplib C++ Library -W cpplib: -T
link:lib
csharedlib C Shared Library -W lib: -T link:lib
我现在稍微明白问题2.3了。是我编译成了c接口的文件。所以在vs2005中调试时候,函数不同了。
我的matlab7.0版,vs2005;
看到E:\MATLAB71\extern\lib\win32\microsoft目录下,只有到msvc50~71
是指我的vs版本太高了,matlab7.0不支持么?
看楼主的范例,似乎matlab7.5支持vs2005?

谢谢~
如果是vs版本太高,那为什么我编译c的可以,而编译c++就不行呢?
柚籽 发表于 2007-11-4 18:55
看到另一帖子里说的关于修改matlab配置文件使其支持2005的方法。
这个配置文件应该修改哪里呢?
我试过修改E:\MATLAB71\bin\win32\mbuildopts下的compp.bat
和E:\MATLAB71\bin\win32\mexopts 下的msvc70opts.bat
内容和下面这个连接的代码一样,只是把vs8

的目录改为自己的安装目录
[url]/forum/thread-803349-1-4.html[/url]

但是还是出现了cpp配置失败的提示。

现在我很困惑为什么自己运行mbuild -setup只有1个选项,第2个是空。

谢谢。
一直卡在这里,可能太啰嗦了,见谅
taohe 发表于 2007-11-5 18:55
可能是matlab7.0不自动支持VS2005。如果要手工修改配置文件的话,应该修改Document and
Settings\你的用户名\Application Data\Mathworks\MATLAB\compopts.bat。

不过matlab7.0的确不是一个好的版本,bug比较多,最好能升级到其后的某个版本,比如7.0.4或者R2007b。
柚籽 发表于 2007-11-6 16:17
[quote]原帖由 [i]taohe[/i] 于 2007-11-5 18:55 发表
[url=/forum/redirect.php?goto=findpost&pid=1181334&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
可能是matlab7.0不自动支持VS2005。如果要手工修改配置文件的话,应该修改Document and
Settings\你的用户名\Application Data\Mathworks\MATLAB\compopts.bat。

不过matlab7.0的确不是一个好的版本,bug比较 ... [/quote]
非常感谢:)我修改了覆盖了这个文件文件,出现了如下错误:
E:\MATLAB71\BIN\WIN32\\..\MEX.PL: Error: The current options file is not
configured to create DLLs. You can use
mbuild -setup to set up an options file which is configured to create DLLs.

可能我借用您另外一个帖子里的代码,只是修改了vs8的目录那一行代码还不够。我后来的解决办法是,安装了vc6+,mubild
-setup选择vc6。然后把compopts.bat文件的VC目录修改为VS8的目录。编译运行通过。(我不知道这样做,我把VC6卸载过后还能不能继续好用。)

--------以下是我参照楼主的例子开始学习matlab与vc的接口以来遇到的一些问题,现在的理解。 高手见笑了,希望能减少少数新人烦恼的时间--
贴在这里了,希望楼主不要介意:)
0、“又出现了另一个问题,LINK : fatal error LNK1104: 无法打开文件“mclmcrrt.lib”
前一页第二章图[url=/forum/attachments/day_071006/20071006_d68a21766c18b23bfcd1n2X2k3tjlHt8.gif]/forum/attachments/day_071006/20071006_d68a21766c18b23bfcd1n2X2k3tjlHt8.gif[/url],添加linker的额外搜索路径的时候,目录要选择到~\microsoft\msvc70,因为看图上只看到microsoft,我误操作了,没有选择一个msvc目录,因此出现了无法打开mclmcrrt.lib的错误。这个是自己太粗心了,没注意看microsoft目录下根本没有mclmcrrt.lib文件。

1、mbuild -setup命令后没有出现vc++的选项
我之后有装vc6.0++,再次运行matlab时候就看到第二个选项是vc6++了。之前没有出现,大概是matlab只能认识在它之后安装的vc程序。

2、我前面说到“mcc -l myadd2 “和“mcc -W cpplib:libmyadd2 -T link:lib myadd2
”的

文件结果时候,提“没看懂-l和-w有什么大的不同。。为什么用另外一个命令编译,得到同样类型的文件,而myadd2传的参数就不同了。”(这个可能让高手见笑了:)。

这个不是-i和-w的区别,而是cpplib:libmyadd2的问题。前一个-i命令产生的是c的接口文件,而后一个命令产生的是c++接口的文件。我向这两种文件唯一的区别在于传的参数一个是mxArray
而另一个是mwArray吧。

3、说到matlab支持vs2005,我现在用vc6引擎编译的文件dll,h,cxf等文件,也完全可以用在vs2005建立项目。大概一个笨的办法就如我这样,装一个vc6作为编译引擎。楼主说的修改compopts.bat是个最方便的方法(我暂时还不知道修改哪些地方)。

学习楼主的例子,收获良多,非常感谢!!!!
eagleliang 发表于 2007-11-11 11:23
非常感谢搂主,在我用上面的方法调试时,弹出了这样的对话框,
Warning: Unable to find Java library: C:\WINDOWS\system32

\/sys/java/jre/win32/jre/bin/client/jvm.dll
please check if you have a MATLAB_JAVA environment variable
Note that MATLAB requires Java version 1.4 or higher
请教一下这是怎么回事?

还有以下的在命令行中出现的错误
I18N Runtime Warning:
Missing ICU data file detected while processing directory containing lib
ut.{dll|so|sl|dylib}.
Hint: Check for a misconfigured environment or installation.
I18N Runtime Warning:
Misconfigured ICU_DATA directory path.
Hint: Check for a misconfigured environment or installation.
Warning: Name is nonexistent or not a directory: C:\WINDOWS\system32\\toolbox\lo
cal.
??? Undefined function or variable 'matlabrc'.

Could not initialize libmyadd2!
fspider 发表于 2007-11-13 21:16
回复 #24 taohe 的帖子
干净系统下,安装了MATLAB
2007B+VS2005,同时也修改了msvc80opts、msvc80compp的安装目录,用MEX和MBUILD时却怎么也无法找到VC2005的编译器,请问怎么回事?你用的时候没有问题么?
附注:不想用25楼提到的替换方法!
taohe 发表于 2007-11-13 21:25
如果是MATLAB 2007B+VS2005的话,应该不会有问题的。

在matlab命令行运行
mex -setup
以及
mbuild -setup
应该就搞定了。
fspider 发表于 2007-11-14 12:57
[quote]原帖由 [i]taohe[/i] 于 2007-11-13 21:25 发表
[url=/forum/redirect.php?goto=findpost&pid=1188138&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
如果是MATLAB 2007B+VS2005的话,应该不会有问题的。

在matlab命令行运行
mex -setup
以及
mbuild -setup
应该就搞定了。 [/quote]
已经这样捣鼓了很久了,就是不行。刚才把两个程序重装了一下,结果依旧,咋会出现这样的情况呢!!看来还是装回VS2003才行。。。:L
taohe 发表于 2007-11-14 22:35
[quote]原帖由 [i]fspider[/i]

于 2007-11-14 12:57 发表
[url=/forum/redirect.php?goto=findpost&pid=1188616&ptid=801187][img]/forum/images/common/back.gif[/img][/url]

已经这样捣鼓了很久了,就是不行。刚才把两个程序重装了一下,结果依旧,咋会出现这样的情况呢!!看来还是装回VS2003才行。。。:L [/quote]
你的问题是在mex -setup的时候无法检测到vs2005吗?

你的matlab和vs2005中的VC++各自都能用吗?

你把在matlab中运行“mex -setup“后显示的信息贴出来,大家帮忙看看。
fspider 发表于 2007-11-15 10:38
[quote]原帖由 [i]taohe[/i] 于 2007-11-14 22:35 发表
[url=/forum/redirect.php?goto=findpost&pid=1189203&ptid=801187][img]/forum/images/common/back.gif[/img][/url]

你的问题是在mex -setup的时候无法检测到vs2005吗?

你的matlab和vs2005中的VC++各自都能用吗?

你把在matlab中运行“mex -setup“后显示的信息贴出来,大家帮忙看看。 [/quote]
刚再一次恢复系统,先装VS2005简体中文版,后装matlab 2007b,直接mex -setup结果如下:
mex -setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2007b\sys\lcc

[0] None

Compiler: 1

Please verify your choices:

Compiler: Lcc-win32 C 2.4.1
Location: D:\PROGRA~1\MATLAB\R2007b\sys\lcc

Are these correct?([y]/n):
没有找到编译器,真有点邪门!
fspider 发表于 2007-11-15 14:25
具体问题还未查明,不过还是用了替换法去解决的,但略有不同,见我新开的帖子[url]/forum/viewt[/url]
... 373&extra=page%3D1 :)
taohe 发表于 2007-11-16 19:28
这个真有点邪门。如果可以的话,不妨把vs2005和matlab的安装路径贴出来,然后在一个dos窗口运行“set”,把结果也贴出来,我们看看能不能找到问题的根源。
fspider 发表于 2007-11-16 21:16
[quote]原帖由 [i]taohe[/i] 于 2007-11-16 19:28 发表
[url=/forum/redirect.php?goto=findpost&pid=1190887&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
这个真有点邪门。如果可以的话,不妨把vs2005和matlab的安装路径贴出来,然后在一个dos窗口运行“set”,把结果也贴出来,我们看看能不能找到问题的根源。
[/quote]
VS2005 D:\Program Files\Microsoft Visual Studio 8
MATLAB D:\Program Files\MATLAB\R2007b
在MATLAB下调用CMD命令结果如下:[code]>> !set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\breezee\Application Data
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=709-320
ComSpec=C:\WINDOWS\system32\cmd.exe
CPU=x86
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Set

tings\breezee
KMP_HANDLE_SIGNALS=0
KMP_STACKSIZE=524288
LOGONSERVER=\\709-320
MATLAB_ARCH=win32
NUMBER_OF_PROCESSORS=2
OMP_NUM_THREADS=1
OS=Windows_NT
Path=D:\Program Files\MATLAB\R2007b\bin\win32;D:\Program
Files\MATLAB\R2007b\sys\java\jre\win32\jre1.6.0\bin;D:\Program
Files\MATLAB\R2007b\sys\webrenderer\windows\corecomponents;D:\Program
Files\MATLAB\R2007b\sys\webrenderer\windows;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;d:\Program
Files\MATLAB\R2007b\bin;d:\Program Files\MATLAB\R2007b\bin\win32
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model 6 Stepping 4, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0604
ProgramFiles=C:\Program Files
PROMPT=$P$G
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\DOCUME~1\breezee\LOCALS~1\Temp
TMP=C:\DOCUME~1\breezee\LOCALS~1\Temp
USERDOMAIN=709-320
USERNAME=breezee
USERPROFILE=C:\Documents and Settings\breezee
VS80COMNTOOLS=D:\Program Files\Microsoft Visual Studio 8\Common7\Tools\
windir=C:\WINDOWS
XPCOM_CHECK_THREADSAFE=0
__KMP_REGISTERED_LIB_664=7908A300-cafe9509-libguide40.lib
>> mex -setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2007b\sys\lcc

[0] None

Compiler:
[/code]如果说环境变量有问题的话,这些自己都可以设置,或者在那些配置文件里直接修改,我尝试过一些情况,问题依旧。还有,下午在另一台机子上Windows
xp sp2(EN)的,结果也同样。。。。

[[i] 本帖最后由 fspider 于 2007-11-16 21:17 编辑 [/i]]
taohe 发表于 2007-11-16 21:42
的确很奇怪,试试看
[code]
mex -setup:msvc80
[/code]
能不能成功。
zhanrixin1983 发表于 2007-11-17 11:49
回复 #1 taohe 的帖子
请问下 能够将matlab中的模糊工具箱变成VC++可以调用的DLL文件吗?
fspider 发表于 2007-11-17 18:37
[quote]原帖由 [i]taohe[/i] 于 2007-11-16 21:42 发表
[url=/forum/redirect.php?goto=findpost&pid=1191010&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
的确很奇怪,试试看

mex -setup:msvc80

能不能成功。 [/quote]
好像还是不行,看下面的结果:L
[code]>> mex -setup:msvc80

Error: Compiler cannot be found on this system . . .

??? Error using ==> mex at 208
Unable to complete successfully.
>> [/code]
taohe 发表于 2007-11-17 20:33
这个问题显得有点诡异了。按理说如果matlab和vs2005各自的安装没有问题的话。matlab应该能找到这个编译器。matlab应该是通过环境变量VS80COMNTOOLS以及Windows
Registry "HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\8.0"或者

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0"

你看看这些变量在你

的电脑上都对吗?

[quote]原帖由 [i]fspider[/i] 于 2007-11-13 21:16 发表
[url=redirect.php?goto=findpost&pid=1188124&ptid=801187][img]images/common/back.gif[/img][/url]
干净系统下,安装了MATLAB
2007B+VS2005,[color=Red][b]同时也修改了msvc80opts、msvc80compp的安装目录[/b][/color],用MEX和MBUILD时却怎么也无法找到VC2005的编译器,请问怎么回事?你用的时候没有问题么?
附注:不想用25楼提到的替 ... [/quote]

不由得又从头看了一下问题的最初描述,不理解为什么要作上面红色字体的操作?
fspider 发表于 2007-11-20 13:33
[quote]原帖由 [i]taohe[/i] 于 2007-11-17 20:33 发表
[url=/forum/redirect.php?goto=findpost&pid=1191611&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
这个问题显得有点诡异了。按理说如果matlab和vs2005各自的安装没有问题的话。matlab应该能找到这个编译器。matlab应该是通过环境变量VS80COMNTOOLS以及Windows
Registry "HKEY_CURRENT_USER\SOFTWARE\Microsoft ... [/quote]
我把你说的相关变量的图像贴出来:
[attach]144652[/attach]

[attach]144653[/attach]

[attach]144654[/attach]

这些应该都没问题,而出现的问题确实奇怪,不知道是不是与我的VS2005版本(8.0.50727.42 RTM)有关。
哦,对了,还有那个安装目录,是指那两个批处理接口文件中的
[code]set VSINSTALLDIR=%VS80COMNTOOLS%\..\..
改成 set VSINSTALLDIR=D:\Program Files\Microsoft Visual Studio 8
[/code]

[[i] 本帖最后由 fspider 于 2007-11-20 13:37 编辑 [/i]]
taohe 发表于 2007-11-20 21:43
抱歉,我实在看不出问题出在那里。这个只能算作一个悬案了。真可惜。

Registry和环境变量看不出有什么不对的地方。再说了,你的vs2005是可以用的,而且你用手工方式配置mex后,也可以在matlab中使用vs2005,真是奇怪。

我的vs2005版本是8.0.50727.762,但是我看不出这个会是问题的根源。

另外的办法就是如果你懂perl的话,可以调试mex的配置程序。matlab是通过几个perl脚本搜索安装好的compiler以及完成配置的。看看这样能不能找到问题。可惜我不懂perl。
taohe 发表于 2007-11-20 22:03
或者再试一下,在运行“mex -setup“之前,先运行
[code]
D:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
[/code]
fspider 发表于 2007-11-21 13:20
[quote]原帖由 [i]taohe[/i] 于 2007-11-20 21:43 发表
[url=/forum/redirect.php?goto=findpost&pid=1194220&ptid=801187][img]/forum/images/common/back.gif[/img][/url]
抱歉,我实在看不出问题出在那里。这个只能算作一个悬案了。真可惜。

Registry和环境变量看不出有什么不对的地方。再说了,你的vs2005是可以用的,而且你用手工方式配置mex后,也可以在matlab中使用vs2005,
...

[/quote]
我也不了解perl,这个问题就这样搁着吧,也许什么时候就发现关键所在了。
不过,还是谢谢taohe关注:handshake


页: [1] 2 3 4 查看完整版本: 【原创】程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)





Powered by Discuz! Archiver 7.0.0 © 2001-2009 Comsenz Inc.


相关文档
最新文档