<span style="font-size:18px;">最近項目功能做完,基本測試也過了一下,程序打包,在自己的的電腦上面運行正常,但是當把程序拷貝到其他沒有安裝開發環境的電腦上面,程序報如下錯誤:</span>
一
在網上搜索資料,http://jingyan.baidu.com/article/95c9d20d4a1726ec4e7561ff.html,根據這個解決方案,安裝了所有的運行時庫(2005,2008,2010,2012等)、framework,但是沒有用。折磨了我快兩天這個問題。
二
發現解決不了,只能繼續在網上搜索,發現了我們清單文件和運行時庫的兩個選項,下面我講解一下我用清單文件和正確安裝運行時庫解決這個問題的方案。
1、清單文件
(1)VS2005以後運行庫採用清單文件來進行查找,清單文件分爲嵌入和不嵌入,嵌入的將會鏈接到exe文件中,而不嵌入的放在exe並行目錄中,可以修改
(2)有關清單文件的設置有兩個 右鍵》屬性》鏈接器》清單文件》生成清單
右鍵》屬性》清單工具》嵌入清單
(3)a、生成清單選擇 是
b、嵌入清單選擇 否
在生成文件裏面可以找到*.exe.manifest,打開,可以發現,
<span style="white-space:pre"> </span><pre name="code" class="html"><?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"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
網上網友說,版本號爲9.0.21022.8,我用的是VS2008,雖然清單文件中的版本號是9.0.21022.8,但是我們項目真正加載的是9.0.30729版本,導致找不到,加載失敗。還是先說按照網友們改清單文件是如何解決的吧。
c、首先找到VS安裝目錄下的運行庫,C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT,我是安裝在C盤的,並且我的是debug版本,拷貝Microsoft.VC90.DebugCRT.manifest、msvcm90d.dll、msvcp90d.dll、msvcr90d.dll這四個文件到exe目錄底下,打開,Microsoft.VC90.DebugCRT.manifest,裏面的版本是9.0.30729.6161,和我們自己生成的版本不一致,我們改爲上面一致9.0.21022.8。這樣程序就會以爲我們剛剛拷貝的版本是9.0.21022.8,進而調用。
<?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.VC90.DebugCRT" version="9.0.30729.6161" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
<file name="msvcr90d.dll" hashalg="SHA1" hash="d57abe3cbe47c78d4a98158ed0256c540b8f1e2e"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>zSAij6xdGHXPGZt2sx3FuDliqtE=</dsig:DigestValue></asmv2:hash></file> <file name="msvcp90d.dll" hashalg="SHA1" hash="92076b706551dcfef3e0dfaefa6974b012b54bd6"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>3KjR7Y2ERz1wAb2zyiLcBQ8Jvjg=</dsig:DigestValue></asmv2:hash></file> <file name="msvcm90d.dll" hashalg="SHA1" hash="8433e3e08aeb16ae9c1fa515e265763907241e62"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>t+3q6m0V0ZpyNqL+1SNwHqhMRQs=</dsig:DigestValue></asmv2:hash></file>
</assembly>
d、一般如果是VS2008+DeBug+(/MDd)這樣拷貝就可以了,但是我的程序因爲運行時要調用VS2010的第三方庫,所以要拷貝相應版本的運行庫到exe目錄底下,C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT,msvcp100d.dll,msvcr100d.dll
e、如果是VS2008+release+/MD版本的,C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT,拷貝這個目錄下的三個文件
VS2008+release +/MDd的,則需要同時拷貝兩個版本的運行庫,並修改清單文件。至於我們程序調用的第三方的dll,也要根據debug和release拷貝相應版本
f、無論是debug或者是release,反正主要是看*.exe.manifest 文件裏面有幾個清單選項
2、運行時庫的選擇,右鍵-》屬性-》C\C++》選項》運行庫
我們看到有/MT,/MTd,/MD, /MDd四個選項,我的項目默認debug是/MDd,release版本下是/MD,帶d的是加調試信息的,也就意味着你的運行庫都要加d。
通過上面的e、f描述,應該也有點明白了,爲什麼我們裝了相應的運行庫,我們的程序還是報錯,
原因是:一般我們安裝的運行庫Redistributable,都是隻帶release版本的庫的,所以如果你的項目的運行庫選項是帶d的時候,也會報錯,解決辦法是安裝運行庫runtime(同時包含debug和release),當然你在網上搜索runtime也很難找到安裝文件。可以到VS的安裝目錄下去找,但是VS2010需要特殊處理纔可安裝。
下一篇文章,我會分享VS2008 和 VS2010 的運行庫供大家下載。