1. 程式人生 > >VC2008下提示找不到MSVCP90D.dll的解決辦法

VC2008下提示找不到MSVCP90D.dll的解決辦法

VS 2005在生成可執行檔案時使用了一種新的技術,該技術生成的可執行檔案會伴隨生成一個清單檔案(manifest file)(.manifest字尾檔案)(其本質上是XML文件,你可以用文字編輯器開啟看看),並在連結完成後將該清單檔案嵌入到exe檔案中(預設情況下)。而在FAT32檔案系統中,在處理清單檔案階段,當增量連結時不能完成清單檔案的更新(預設情況下),於是造成清單檔案嵌入失敗,從而使該exe檔案執行時沒有相應的清單檔案而執行失敗並提示如上錯誤。

1. 好像是fat32下時間戳有問題(在ntfs下這個問題就沒有了),搞得manifest有時嵌入不到exe中(預設配置是嵌入的,所以就報錯找不到 dll了。

2. 磁碟系統是fat32格式的:FAT32的時間精度不夠,所以linker在生成檔案的時候會出錯,如果是ntfs的就沒有問題


解決方案很多,列舉如下:
1. 由於這是在連結動態執行庫出現的問題,所以你可以選擇程式碼生成的連線方式為/MTd而非/MDd,不用這些DLL檔案從而避免問題的出現。該方法有一個很顯然的缺點:適用範圍有限,不推薦該方法。
2. 既然跟FAT32系統有關,那麼我們可以選擇在NTFS檔案系統中開發從而避免該問題,此方法同上,也是採用的迴避問題的方式,不提倡。
3. 該方法仍與FAT32有關:在專案的“屬性|配置屬性|清單工具|常規(Project | Game Properties | Configuration Properties | C/C++ | Code Generation | Runtime Library

)”中的“使用FAT32解決辦法”選擇“是”(預設為“否”),重新生成專案即可解決問題。該方法是唯一真正針對問題所在而提出的解決方法,使清單工具可以正確更新。(此方法是官方解決方法,也比較方便,推薦)
4. 既然問題是在更新嵌入的清單檔案時發生的,由於FAT32的原因而未能更新嵌入的清單檔案,於是我們有如下兩種解決方法:
(1)不啟用增量連結。在專案的“屬性|配置屬性|連結器|常規”中的“啟用增量連結”選擇“否”。此方法阻斷了問題產生的源頭,其每次生成exe檔案時都直接嵌入清單檔案,而不是預設的根據時戳而決定是否更新清單檔案。
(2)不嵌入清單檔案。在專案的“屬性|配置屬性|清單工具|輸入和輸出”中的“嵌入清單”選擇“否”,從而在生成exe檔案時附隨生成一個清單檔案(預設情況下,其檔名為exe檔案的全名加上“.manifest”),避免了嵌入清單檔案可能失敗的問題。在程式執行時,會用到該清單檔案。顯然,這種方式使可執行程式產生了更多的外部依賴,不推薦。

另外,還有一個不能稱為方法的土辦法:每次Build前手動刪除*.ilk檔案(增量連結檔案)(當然可以在專案屬性中寫入刪除命令
,使其自動執行),不推薦該土辦法。
最後,總結一下:
1. 此問題只在特定條件下才會出現:在FAT32檔案系統中編譯、預設設定(增量模式、不啟用FAT32解決方案、嵌入清單檔案)、非第一次生成可執行檔案檔案(即在增量連線、更新清單檔案時)。
2. 解決方案1和4.1方便實用,推薦使用。

manifest原理和用途

dll是被動態呼叫的,所以會被若干個程式共享使用的 但是如果dll在應用程式不知道的情況下升級了、或是被另一個程式更改了,就可能會出現問題,即”DLL Hell”

隨著系統資源越來越豐富,硬碟不那麼緊張,所以在XP以後的作業系統中,用新的機制來管理DLL
(這種機制,這不僅僅是對於.NET而言,對於普通的Native程式也是一樣的)

Madifest是個XML的描述檔案,對於每個DLL有DLL的Manifest檔案,對於每個應用程式Application也有自己的Manifest

對於應用程式而言,Manifest可以是一個和exe檔案同一目錄下的.manifest檔案,也可以是作為一個資源嵌入在exe檔案內部的(Embed Manifest)

XP以前版本的windows,會像以前那樣執行這個exe檔案,尋找相應的dll,沒有分別
Manifest只是個多餘的檔案或資源,dll檔案會直接到system32的目錄下查詢,並且呼叫

而XP以後的作業系統,則會首先讀取Manifest,獲得exe檔案需要呼叫的DLL列表
(此時獲得的,並不直接是DLL檔案的本身的位置,而是DLL的manifest)
作業系統再根據DLL的Manifest去尋找對應的DLL
<因此就可能區別不同版本的同一個DLL檔案,或是指定一個程式本身Isolated的DLL>

不過使用Visual Studio 2005以後的一個新問題是,
VS2005帶的8.0新版的C執行庫(VC 8.0 CRT)檔案在XP以後支援manifest的Windows版本中被呼叫時,
將會check一下Application自身的Manifest,否則將會拒絕被呼叫
這也就是說,使用Visual Studio開發的Application,Manifest將是必不可少的
(搞不懂MS為啥要這樣設定,所以與VS2003.NET不同了)
(後來想想,除了MS自己說的哪些冠冕堂皇的原因,至少這樣一來Linux的Wine模擬要麻煩多了)

除非,你的程式是靜態連結的,沒有使用dll,只使用了作業系統核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等
project的設定必須是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support
那麼你可以不需要考慮Manifest 可以關掉它

相關推薦

VC2008提示MSVCP90D.dll解決辦法

VS 2005在生成可執行檔案時使用了一種新的技術,該技術生成的可執行檔案會伴隨生成一個清單檔案(manifest file)(.manifest字尾檔案)(其本質上是XML文件,你可以用文字編輯器開啟看看),並在連結完成後將該清單檔案嵌入到exe檔案中(預設情況下)。

ant打包提示到檔案解決辦法

執行ant打包時如果出現提示找不到tools目錄下某些jar或者bat檔案的錯誤。是因為新版android-sdk目錄結構產生了變化,原本在sdk/tools目錄下的檔案被轉移到sdk/build-tools/各個版本號資料夾中。需要複製裡面的內容至sdk/tools下即可

安裝mysql在提示dll檔案的一些個人經驗和問題

1.在W10下安裝mysql-installer-community-8.0.x.msi時安裝到initializing Database時提示找不到LIBEAY32.DLL和ssleay32.dll導致安裝失敗。嘗試了網上的一些方法,沒有解決。 2.又從官網下載了一個mysql-5.7.2

Unity_打包Android提示到jdk解決方案

Please make sure you have a suitable JDK installation.Android development requires at least JDK 7(1.7),having JRE only is not enoug

安裝Android Studio提示到JDK解決方法

Google推出的Android開發工具Android Studio亮點不少,有些功能實在是強大。基於Intellij idea,幾乎完美解決了Eclipse太耗資源的問題。 但在Windows 64位系統環境下安裝的時候,提示找不到JDK,儘管你可能已經設定好了環境變數。 解決辦法如下: 管理員

Maven專案配置檔案到的解決辦法

問題出現 在構件Maven專案時候,我們已經將配置檔案放在包下,但是專案執行出錯,報錯找不到xxx.xml檔案. 先來分析一下普通Maven專案的專案檢視: 在src下有main和test兩個

ubuntu 提示/etcfstab 中到iso 解決辦法

更新:最新解決辦法:mount -o loop .iso /media/cdrom 指定掛載點就可以了 sudo gedit /etc/fstab 在末尾新增一行 /你的iso路徑 /你想掛載的位置 iso9660 例如 /home/ubuntu.iso /media/

Linux修改環境變量,小心改錯,到命令解決辦法

改錯 3.1 sbin bin 修改 lin color data- 環境變量 PATH改錯了找不到命令 解決方法: 重新定義PATH export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbi

intelli idea中配置Tomcat到的解決辦法

tomcat tle 又是 server deploy 工程 路徑名 clip avi 這兩天新入職一家公司,公司用的是intelli idea,以前用習慣了eclipse,感覺到有點不太習慣,當然,intelli idea也有自己的強大之處。在開始配置Tomact之前,按

idea 多模塊依賴時 tomcat啟動 到類解決辦法

exception 多模塊 ont 圖片 ava .com com http 模塊 三個模塊,moduleA、moduleB、moduleC,A依賴B和C,在idea中使用tomcat部署moduleA子模塊時,一直提示java.lang.ClassNotFoundExce

ubuntu18.04終端及應用縮小之後到的解決辦法

water watermark 使用 vpd OS mark 應用 管理 ges 連著兩天使用ubuntu,都發現一旦打開終端和應用縮小時,打開任務管理器,能看到在運行著,但是不知道在哪打開,因為兩天都碰到這個問題,就自己摸索了一下,終於發現了解決辦法,其實很簡單。 如下圖

java:[69,70] 到符號 解決辦法

lean jar 目錄 引入 ava 問題 錯誤 end mave 最近使用maven clean ,install項目後,發現一堆的“java:[69,70] 找不到符號”問題,如下: 解決方案: 把maven項目 Add to Build Path 引入的本

Tomcat到主頁解決辦法

1、用自己安裝的Tomcat 找到伺服器 alt + enter進入屬性編輯 點選Switch Location切換為localhost server,應用並關閉 再雙擊伺服器進入下面屬性修改 修改後記住crtl+s 重啟伺服器並嘗試 2、如失效,找到T

git下載Maven專案壓縮包後到專案解決辦法

大家好:      最近遇到了從git上下載專案原始碼的問題,但是,下載的原始碼沒有自己要找的專案,於是犯愁了。      解決辦法: cmd開啟命令視窗,找到原始碼放的位置:輸入: mvn -f pom.xml eclip

SSM專案中引入其他jar到,解決辦法(jodconverter-2.2.2.jar)

安裝到mvn裡面 mvn install:install-file -Dfile=jodconverter-2.2.2.jar -DgroupId=org.improve4meaven.jodconverter -DartifactId=jodconverter -Dversion= -

RedHat(小紅帽) yum用了的解決辦法

由於RedHat是商業版的,通常由於沒有註冊,導致yum程式無法使用(linux下面,yum是個安裝軟體的“神器”)。此時可用CentOS的地址進行替換。下面將一步步說明如何處理: 一、刪除RedHat自帶的yum相關檔案   1、檔案位置:/etc/yum.conf和/e

編譯 android SLES/OpenSLESUT.h 到的解決辦法

在編譯android原始碼的時候,遇到問題: target Strip: AudioInRecord (out/target/product/generic/obj/EXECUTABLES/Audio

Android 4.1原始碼編譯到資原始檔解決辦法

我們在Android framework中修改資原始檔時,在Android 4.0之前,都是直接在sourcecode/frameworks/base/core/res/res下面新增對應的資原始檔,然後編譯framework-res即可,但是這種情況到了Android

Linux 誤修改etc/profile後導致所有命令都到的解決辦法

今天在修改etc/profile後,準備source重新整理的時候,忽然發現所有命令都執行不了了!最尷尬的是由於所有命令都"not found"了,所以就沒法再去修改了,後來百度之後,找到了解決方法:#/bin/vi  /etc/profile           通過這種方

Windows10安裝Python2.7模組mod_wsgi提示到apr_perms_set.h問題的解決辦法

環境:Windows 10 x86,Apache 2.4.x,Python 2.7.x,Microsoft Visual C++ Compiler Package for Python 2.7 安裝 mod_wsgi前,需要先設定環境變數MOD_WSGI_APACHE_ROOTDI