OpenCV使用MSVCR80.dll

在開始第一個OpenCV專案時,跟著網路上的範例將程式碼輸入一個新建的Win32命令列專案中,經過編譯及連結,所有過程完全順利,最後產生了一個可執行檔。

結果一執行時,就出現缺少MSVCR80.dll的訊息。怎麼會這樣呢?我執行的環境中是有安裝Visual Studio 2005的開發環境的啊。照理說,在這樣的環境下是不會缺少什麼DLL的吧。而且,這種一看就是Visual Studio本身會有的DLL,一般而言都是安裝到System32中了,不需要再另外複製一份到程式的執行檔目錄中才對啊。

於是就上網查了一下相關的資訊,原來大家都有遇過這種問題。只不過,他們可能不是使用OpenCV。解決的方式好像有三種。不過這篇文章中最後一種方式,我試過是沒有用的。後來是使用了第二種方式才解決問題。第二種方式主要是在manifest檔案中加入相依性的參考

一開始如果方案建置完成時,你的manifest檔的內容應該是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

</dependentAssembly>

</dependency>

<dependency>

<dependentAssembly>

<assemblyIdentity type="Win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="X86" publicKeyToken="1fc8b3b9a1e18e3b" language="*"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

而在加了#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")後,會多了粉紅色的區塊:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.4053" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

</dependentAssembly>

</dependency>

<dependency>

<dependentAssembly>

<assemblyIdentity type="Win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="X86" publicKeyToken="1fc8b3b9a1e18e3b" language="*"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

這樣就可以正常地執行了。

之所以會有這些問題,主要是在xp vista中開始引入manifest的使用。有關manifest的說明可能考這裏

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)