close

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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Pelikan 4001 的頭像
    Pelikan 4001

    Pelikan 4001

    Pelikan 4001 發表在 痞客邦 留言(0) 人氣()