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

C++调用MATLAB生成的dll问题

[复制链接]
发表于 2013-10-31 16:35:21 | 显示全部楼层 |阅读模式 来自 北京
最近混编遇到这样一个问题,就是MATLAB写成的m文件编译成dll供C++调用,如果这个m文件纯用MATLAB语言,一切没问题。实际情况是这个m文件用到了一个mex文件,这个mex文件调用了很多C++的dll。
问题于是来了,mcc编译时不加编译选项 -a *.dll(把所有这些依赖的dll打包进m文件编译的dll中去),或者不手动设置环境变量,那么实际运行中老是提示找不到上面那个mex文件

我自己的初步分析如下:MATLAB编译的dll在运行时会把依赖的文件解压到
  1. C:\Users\UserName\AppData\Local\Temp\UserName\mcrCache*.*
复制代码
下,从而路径会转移到上面。如果都是MATLAB自己的东西,当然都没问题,用到第三方库了,又没有手动打包进去,所以会出现找不到文件的错误。
大家有遇到过类似情况的吗?这样的话,不设置环境变量有无解决办法呢?
发表于 2013-11-1 18:52:14 | 显示全部楼层 来自 英国
Simdroid开发平台
这种是实实在在的依赖关系(就是mex对于那些第三方库的依赖关系),如果是对那些第三方库是动态链接的,那么那些DLL必须在当前该用户的环境变量"PATH"所包含的目录中,或者和mex在同一个目录中,别无他法。

如果可以静态链接那些第三方库文件的话,就不会有这样的问题。

如果只能动态链接那些第三方库,不妨考虑不要把那些库包含到你用matlab编译生成的文件包中,而是另外打包那些第三方DLL文件,文档中写明在使用你的DLL之前,必须先“安装”另一个包中DLL文件,并相应的修改%PATH%环境变量。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-11-4 09:20:06 | 显示全部楼层 来自 北京
本帖最后由 rocwoods 于 2013-11-4 09:21 编辑
taohe 发表于 2013-11-1 18:52
这种是实实在在的依赖关系(就是mex对于那些第三方库的依赖关系),如果是对那些第三方库是动态链接的,那 ...

周末看孩子没时间上网,现在才回,抱歉!
感谢taohe兄出手,好久不见呀,最近看您又登录了,所以抛出这个存在已久的问题。
我现在的做法就是修改环境变量,如果仅仅用到那些dll的函数干脆就用loadlibrary直接导入那些dll的函数,从而不用写mex文件了。虽说不影响使用,每次在新的目标机上设置环境变量有点小麻烦。
taohe兄有加速MATLLAB编译的exe启动速度的经验没?网上查的稍微有效的就是用-nojvm的方式编译,这里给出了一种方法,但是不知道是不是我这里试验的有问题,我试验前后没有明显提速。
http://undocumentedmatlab.com/bl ... piled-apps-startup/
回复 不支持

使用道具 举报

发表于 2013-11-4 18:04:55 | 显示全部楼层 来自 英国
如果用-nojvm编译,其结果在启动时可能快了,但程序的执行速度有没有受影响?

你给的链接是通过避免每次执行时都解压缩文件,从而达到启动时间加速的效果。除非你的程序相当复杂,包含很多m函数,否则那点解压时间应该算不了什么。

我不知道能有什么可以有效地加速matlab编译产生的exe的启动速度。
回复 不支持

使用道具 举报

 楼主| 发表于 2013-11-5 09:01:38 | 显示全部楼层 来自 北京
taohe 发表于 2013-11-4 18:04
如果用-nojvm编译,其结果在启动时可能快了,但程序的执行速度有没有受影响?

你给的链接是通过避免每次执 ...

嗯,-nojvm编译对执行速度没有任何明显影响,仅仅是启动速度快了一点。看来加快exe的启动时间很难做到,采用dll方式混编,也就第一次调用时,初始化MCR花点时间,以后就快了,而exe每次都需要初始化MCR。
回复 不支持

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-21 02:57 , Processed in 0.035037 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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