天天看點

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.html或http://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點選運作即可.

繼續閱讀