matalb7与VC2008混合编程DLL方法(四)脱离matlab和VC环境的运行和程序发布

 

    本文首先介绍matlab7与VC2008混合编程的VC程序在脱离(即未安装)matlab和VC环境的计算机上运行时可能出现的错误及解决办法,然后介绍混合编程的VC程序做成安装包的方法。

1. 出现错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”

(1)错误原因

    网上关于错误原因的解释不尽相同,主要包括以下2种:

    a. 缺少VC所需dll库

       帖子http://www.cnblogs.com/lne818/archive/2008/11/07/1328845.html认为这是错误原因。

    b.找不到C运行库(CRT

       帖子http://hi.baidu.com/jisu3d/blog/item/ba4bfd4f28fa7ff5d62afcdd.html认为这是错误原因。

(2)解决问题的办法

    错误原因可能多种多样,但我们更关心如何纠正错误。

    帖子http://www.cnblogs.com/lne818/archive/2008/11/07/1328845.html中给出了几个解决方法,其中2个试过后确实有效。

    这个帖子给出的4种方法,如下:

 

 方法一:
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:

msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest

把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。

其他release版、MFC程序什么的都是拷redist下相应文件夹下的文件就可以了,文件夹后都有标识!

方法二:
修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就不再需要VC的dll了。

方法三:

工程-》属性-》配置属性-》常规-》MFC的使用,选择“在静态库中使用mfc”
这样生成的exe文件应该就可以在其他机器上跑了。

方法四:

你的vc8安装盘上找到再分发包vcredist_xxx.exe和你的程序捆绑安装

 

    方法一,需要去拷贝一些文件感觉麻烦,没有尝试。

    方法四,需要安装另外一个“再分发包”程序,也觉得有些繁琐。因为我要将最终的VC程序做成安装文件,在其他计算机上安装后运行,希望安装一次就可以运行。如果安装过程需要先后安装2个文件,觉得会给使用者不舒服的感觉,所以也没有尝试这种方法。当然,也许这种方法可能也不会像想象中那么差。

    我实际上同时采用了第二种和第三种。确实解决了问题。

 

(3)补充说明方法二中修改编译选项的具体步骤

    a. 通过点击菜单 Project->工程名称 Property Pages(也就是Project菜单下面的最下面一项),进入工程属性界面。

    b. 鼠标点击选中 Configuration Properties->C/C++->Code Generation,并在界面右面的Runtime Library中将/MD或/MDd 改为 /MT或/MTd

    关于/MT,/MD的解释可参考http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.htmlhttp://hi.baidu.com/kuhuazai/blog/item/2e7dfbec5c485ac62e2e215e.html

    我对/MD、/MDd、/MT和/MTd的差别还是不太了解,个人感觉:带d的应当对应于Debug版,不带d的对应于Release版;/MT会把所用到的C库函数静态编译连接入程序的obj中,所以始终跟程序在一起,不会找不到;而/MD时,用到的C库函数是在VC的DLL文件中,所以如果找不到DLL文件就会出错。

    另外,修改设置后一定要编译一下,检查是否有错误。可能出现错误如下:

    a.“unresolved external symbol _mclcppFeval”

    这很可能是因为Configuration Properties->Linker->Input的Aditional Dependencies项中没有加入matlab混合编程用的lib文件。加入lib的方法请参考本博客的博文matalb7与VC2008混合编程DLL方法(一)。

    b. #error : Please use the /MD switch for _AFXDLL builds

    解决办法参考http://chenrongya.blog.163.com/blog/static/874741962010102283953825/,如下

在用vs打开项目后,编译的时候出现“Please use the /MD switch for _AFXDLL builds”

这个错误的解决方法如下:


修改如下设置:工程(Project)->属性(Properties)->配置属性(Configuration Properties)->c/c++->代码生成(Code Generation)->运行时库(Use run-time library)->多线程调试DLL(/MDd)(Multithreaded DLL/Debug Multithreaded DLL)

     可以看出,有时候修改编译选项会导致错误,具体原因我还没仔细研究。

2. 出现提示“找不到mclmcrrt70.dll”或“mclmcrrt70.dll缺失”等类错误

    mclmcrrt70.dll是matlab的动态链接库文件,VC与matlab混合编程时VC用到了这个库,只有这个库与VC的*.exe文件在同一个文件夹,或在操作系统的system32文件夹下,或通过环境变量可以定位找到该库文件时,这个错误才会消失。

    解决办法为:在“matlab安装目录\toolbox\compiler\deploy\win32”下找到“MCRInstaller.exe”安装上即可。

 

3.混合编程的VC程序做成安装包的方法

    在前面的1节和2节中,介绍了在没有安装matlab和VC的计算机上运行混合编程的vc程序过程中常出现的2种错误和解决办法。

    如果进一步需要将混合编程的vc程序做成安装包,在没安装matlab和vc的计算机上安装后就能运行,还需要下面的处理:

    (1)在调试VC程序的计算机(以下简称调试计算机)上安装MCRInstaller.exe。假设安装路径为:“D:\Program Files\MathWorks”。

    (2)在调试计算机上,将matlab的m函数生成的*.dll和*.ctf文件以及VC程序的*.exe文件的Release版拷贝到“D:\Program Files\MathWorks\MATLAB Component Runtime\v70\runtime\win32”加下。在该文件夹下有很多*.dll文件,这些都是vc程序运行时需要用到的matlab动态链接库文件,其中包括2节中提到的mclmcrrt70.dll,

      关于如何得到matlab的m函数生成的*.dll和*.ctf文件,请参考本博客的博文matalb7与VC2008混合编程DLL方法(一)。

    (3)安装包的制作

     可以使用“Advanced Installer”软件来完成,该软件的使用方法可参考http://hjq153.blog.51cto.com/100640/101995。这里需要强调的是,在安装程序制作过程中,“选择要打包的应用程序的路径”时应当选择的是调试计算机的“D:\Program Files\MathWorks\MATLAB Component Runtime\v70”文件夹。当然实际的路径要由MCRInstaller.exe的实际安装路径来确定。

     安装包制作好后,安装到运行程序的计算机(以下简称目标计算机)上即可。

 

     另外,如果不想做安装包,而只是想在目标计算机(可能没安装matlab和VC)运行程序,那么只需将调试计算机的“D:\Program Files\MathWorks\MATLAB Component Runtime\v70”文件夹下的全部内容原封不动地拷贝到目标计算机上的一个文件夹中。运行程序时,在目标计算机的这个文件下的“\runtime\win32”子文件夹中找到VC的*.exe点击运行即可.

    

猜你喜欢

转载自blog.csdn.net/dreamofnous/article/details/7110267