VC2005和VC2008編譯出來(lái)的程序放到別人的電腦上為什么有可能無(wú)法運(yùn)行呢?
這個(gè)問(wèn)題無(wú)數(shù)人在問(wèn),但是很遺憾,沒(méi)有人給出完整的解釋和完美的解決方案。其實(shí)我也只有一臺(tái)電腦,而且裝了VC了,這個(gè)問(wèn)題必須要臺(tái)沒(méi)有裝這類軟件的電腦才容易去分析。感謝那些為了測(cè)試我小程序的朋友,是你們一次次在如此惡劣的網(wǎng)絡(luò)速度下收取我一次次修改的dll包和部署文件,才讓這個(gè)問(wèn)題的完美解決方案浮出水面。這里就把我的經(jīng)驗(yàn)給大家分享吧。
1:Microsoft Visual C++ 2008 Express Edition可以發(fā)布軟件嗎?
能!
很多人說(shuō),因?yàn)槭荅xpress版,不是Studio,所以只是用來(lái)練習(xí)語(yǔ)言的,不能發(fā)布軟件——錯(cuò)!
除了沒(méi)有MFC和ATL,基本上跟 .net 版本是一樣的。發(fā)布出來(lái)的,是完整的可執(zhí)行文件。
2:VC 2008 (2005) 發(fā)布出來(lái)的程序必須附帶上他們特定的dll文件嗎?
不一定。
如果目標(biāo)系統(tǒng)是個(gè)經(jīng)常升級(jí)的系統(tǒng),微軟已經(jīng)為其打上了所需要的dll文件補(bǔ)丁了,不需要在軟件包里面附加特定的dll文件。特別在Vista系統(tǒng)中,你更是不需要VC8和VC9的dll文件。但是在一些老版本的系統(tǒng)中,這些文件就是必須的。
3:VC2008和VC2005特定的dll文件是哪些?
VC8: msvcm80.dll, msvcp80.dll, msvcr80.dll
VC9: msvcm90.dll, msvcp90.dll, msvcr90.dll
4:如何部署文件?
首先,請(qǐng)選擇release版本;在生成可執(zhí)行文件(exe文件)的時(shí)候,會(huì)得到相應(yīng)的部署文件(manifest文件)。
比如,得到a.exe文件,就會(huì)同時(shí)生成a.exe.intermediate.manifest文件。請(qǐng)將這2個(gè)文件放在同一文件夾下。
然后,你需要VC8和VC9的部署文件:Microsoft.VC80.CRT.manifest和Microsoft.VC90.CRT.manifest。
請(qǐng)到你的VC安裝目錄下尋找,比如:
C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT
我這里也把2個(gè)部署文件直接貼出來(lái),沒(méi)裝的直接用就是了:
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個(gè)dll以及這個(gè)manifest裝到一個(gè)文件夾里,并將文件夾命名為Microsoft.VC80.CRT。
同樣將VC9的3個(gè)dll以及這個(gè)manifest裝到一個(gè)文件夾里,并將文件夾命名為Microsoft.VC90.CRT。
將這2個(gè)文件夾放到與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生成出來(lái)就需要VC90和VC80的CRT,我們能有什么脾氣呢……
也就是說(shuō),還別管你exe文件多大,要保證正常運(yùn)行,我們需要首先拷貝這8個(gè)文件……
MinGW(gcc)編譯的就沒(méi)這些麻煩。所以,我現(xiàn)在都是用兩個(gè)編譯器編譯兩個(gè)exe以供發(fā)布了。
posted on 2008-04-12 01:51
lf426 閱讀(19417)
評(píng)論(19) 編輯 收藏 引用 所屬分類:
Win32與VC