4053
某些程式在VC偵錯模式下找不到MSVCR80.DLL的問題
原文發表:http://heresy.spaces.live.com/blog/cns!E0070FB8ECF9015F!8689.entry恩…自己寫完後
都覺得真是超長的一個標題。
首先呢
這個問題的發生
主要是因為 Heresy 這邊工作上目前都是用 Visual Studio 2005 來寫 C 的程式;而為了簡化開發呢
在不少非核心的部分(例如讀取影像檔案)
有使用一些現有的 Open Source 函式庫。
而這次碰到的問題
就是在使用 libgeotiff 時發生的了…主要狀況
就如同標題所述
只要執行某些 debug 版的程式
就會出現找不到 MSVCR80.DLL 的問題(如下圖對話框);而相對的
release 版則沒有任何問題。
MSVCR80.dll 基本上是微軟的 C Runtime Library 的一個檔案
在執行 Visual C 2005 (8.0) 所編譯的程式時
大多需要這個檔案;對於一般使用者來說
只要有安裝對應的「可轉發套件」(例如:Microsoft Visual C 2005 SP1 可轉散發套件)
大多就會把檔案複製到系統裡了~而實際上
目前有不少程式都會先自動裝上這東西。
而理論上
在有安裝 Visual Stuio 的電腦上
不應該會出現這樣的問題?本來一直以為是 Windows 或 Visual Studio 的設定爛掉了
後來找了老半天
才發現其他程式似乎沒有類似的問題;後來再進一步釐清
似乎和設定無關
而是其他方面的問題。
到目前為止
Heresy 是認定這應該是「部分有使用到 release 版 libgeotiff 的程式」才有的問題;而類似的問題(不見得是 libgeotiff)
其實在網路上也是找的到討論的。
發生的原因呢?似乎是因為 debug 版的程式
用了 release 版的動態函式庫
導至在某些其況下
會沒有辦法正確地讀取 release 版的 MSVCR80 所造成的(話說
libtiff 就不會有這問題?)。
而最根本的解決方法
應該就是把所有函式庫
都各自建置 release、debug 兩種版本了~但是其實這樣滿麻煩的
不但在一般情況下
不太可能會進去追函式庫裡的程式;而且如果是像 Heresy 這邊還有 win32 和 x64 的話…就變成要維護四種版本了… orz 後來有找到兩種可能的解法
其實意義是一樣的;就是要把相依性(dependency)的資訊
強制加到程式的執行檔裡。
而所需的相依性資訊的來源
其實就是 VC 2005 在編譯後會產生的 manifest 檔(中文版把這個叫做「資訊清單檔」)了~ 解法一:在程式的原始碼內加入相依性資訊。
在程式的 .CPP 檔裡
加上 #pragma comment(linker