VC2005和VC2008編譯出來的程序放到別人的電腦上為什么有可能無法運行呢?
這個問題無數人在問,但是很遺憾,沒有人給出完整的解釋和完美的解決方案。其實我也只有一臺電腦,而且裝了VC了,這個問題必須要臺沒有裝這類軟件的電腦才容易去分析。感謝那些為了測試我小程序的朋友,是你們一次次在如此惡劣的網絡速度下收取我一次次修改的dll包和部署文件,才讓這個問題的完美解決方案浮出水面。這里就把我的經驗給大家分享吧。
1:Microsoft Visual C++ 2008 Express Edition可以發布軟件嗎?
能!
很多人說,因為是Express版,不是Studio,所以只是用來練習語言的,不能發布軟件——錯!
除了沒有MFC和ATL,基本上跟 .net 版本是一樣的。發布出來的,是完整的可執行文件。
2:VC 2008 (2005) 發布出來的程序必須附帶上他們特定的dll文件嗎?
不一定。
如果目標系統是個經常升級的系統,微軟已經為其打上了所需要的dll文件補丁了,不需要在軟件包里面附加特定的dll文件。特別在Vista系統中,你更是不需要VC8和VC9的dll文件。但是在一些老版本的系統中,這些文件就是必須的。
3:VC2008和VC2005特定的dll文件是哪些?
VC8: msvcm80.dll, msvcp80.dll, msvcr80.dll
VC9: msvcm90.dll, msvcp90.dll, msvcr90.dll
4:如何部署文件?
首先,請選擇release版本;在生成可執行文件(exe文件)的時候,會得到相應的部署文件(manifest文件)。
比如,得到a.exe文件,就會同時生成a.exe.intermediate.manifest文件。請將這2個文件放在同一文件夾下。
然后,你需要VC8和VC9的部署文件:Microsoft.VC80.CRT.manifest和Microsoft.VC90.CRT.manifest。
請到你的VC安裝目錄下尋找,比如:
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT
我這里也把2個部署文件直接貼出來,沒裝的直接用就是了:
Microsoft.VC80.CRT.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable></noInheritable>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
<file name="msvcr80.dll" /> <file name="msvcp80.dll" /> <file name="msvcm80.dll" />
</assembly>
Microsoft.VC90.CRT.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation. All rights reserved. -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable/>
<assemblyIdentity
type="win32"
name="Microsoft.VC90.CRT"
version="9.0.21022.8"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"
/>
<file name="msvcr90.dll" /> <file name="msvcp90.dll" /> <file name="msvcm90.dll" />
</assembly>
然后將VC8的3個dll以及這個manifest裝到一個文件夾里,并將文件夾命名為Microsoft.VC80.CRT。
同樣將VC9的3個dll以及這個manifest裝到一個文件夾里,并將文件夾命名為Microsoft.VC90.CRT。
將這2個文件夾放到與exe文件(及其部署文件)所在目錄下就OK了。
至于為什么VC9編譯的程序要用VC8的dll,大家可以看看我例程部署文件:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
VC 2008生成出來就需要VC90和VC80的CRT,我們能有什么脾氣呢……
也就是說,還別管你exe文件多大,要保證正常運行,我們需要首先拷貝這8個文件……
MinGW(gcc)編譯的就沒這些麻煩。所以,我現在都是用兩個編譯器編譯兩個exe以供發布了。
posted on 2008-04-12 01:51
lf426 閱讀(19417)
評論(19) 編輯 收藏 引用 所屬分類:
Win32與VC