天天看點

轉載: 找不到MSVCR90.dll、Debug vs Release及cppLapack相關

今天調試程式時出現了,找不到MSCVR90.dll的錯誤,最好查找到了解決辦法

最近使用cppLapack,nmake運作正常,在Release模式下也編譯運作正常,在Debug模

式下也能編譯通過,但一運作就彈出一個對話框,提示沒有找到MSVCR90D.dll,程式未能啟

動,而如果把該DLL拷貝到系統目錄或目前目錄下,又會出現另一問題,提示說Debug Error,我都瘋掉了,程式是示例程式,沒有錯的,但究竟哪裡錯了呢?

圖1: 找不到MSVCR90.dll

圖2:更多的錯誤

圖3:解決方法之一

圖4:解決方法之二

        于是百度之,首先找到一個答案說這是Visual Studio 2008安裝在FAT32分區下的bug,轉換為NTFS就行了,但這顯然不是我想要的,因為我的硬碟全都是NTFS的;于是繼續google,找到一篇文章,,說是要在配置裡忽略掉MSVCRT庫,我試了一下問題依舊;繼續google,這回找到MSDN上了,MSDN說是沒有安裝VC運作庫,于是我又從microsoft上下回來VC運作庫,安裝,問題依舊。快要瘋了。繼續google+baidu,功夫不負有心人,終于讓我找到了答案,現記錄在此,供參考。

  1. 1.         在“屬性”->“C/C++”->“代碼生成”->“運作時庫”裡面設為“多線程DLL”。
  2. 2.         在程式裡添加這一行奇怪的代碼:

#pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='X86' publicKeyToken='1fc8b3b9a1e18e3b' language='*'\"")

    由以上表現可知問題出在Debug模式裡,又搜尋了Debug與Release模式的差別,得到的答案是:

實際上,"Debug"和"Release"隻是兩套IDE預先設定好的編譯參數和宏定義組合(例如我們經常遇到的_DEBUG和NDEBUG宏)。編譯 器并不知道Debug和Release之分(不過MD和MDd編譯參數會區分Debug版本和Release版本的運作時庫)。當混用用Debug設定編譯的程式和Release版本的運作時庫的時候,由于它們生成的時候使用的是兩套不同的編譯選項,是以非常可能互不相容。

         另外,STL在Debug與Release模式下性能有較大的差異,是以測試STL是最好在Release模式下。

         再說一說cppLapack,由于最近要做矩陣運算是以使用了這個東西。它是一個小日本寫的,封裝了lapack(著名的線性代數庫,這個大家都知道了吧)一些常用的函數,注意是常用而不是全部。lapack性能雖然沒得說,但接口不是很友好,使用起來有些不友善。cppLapack是sourceforge上的一個開源項目,首頁為http://cpplapack.sourceforge.net/ ,它的接口比較好用,性能也還不錯,還獨有“Smart-Temporary”系統以最小化臨時變量(實際上是一些數組)的複制,其實就是盡量重複使用記憶體以提高效率。但它資料類型有限,而且限制隻能為double,不能使用float,矩陣功能也有限,隻能解決一些基本的線性代數問題,如轉置、矩陣乘積、求逆、解線性方程等,要是拿來做共轭梯度就不行了(這要靠Intel MKL,有空再說)。

         前面說了一大堆cpplapack,但如何使用還是一個尚未解決的問題,一個好的庫如果編譯不了再好也沒用,是吧?我曾從網上下過很多源碼,但很少有拿來就能編譯成功的(是不是有同感?),cpplapack也不例外。看看都會出現什麼error吧:

c:\cpplapack\cpplapack\include\dgematrix-\dgematrix-misc.hpp(163) : error C2061: 

文法錯誤 : 辨別符“A” 

c:\cpplapack\cpplapack\include\dgematrix-\dgematrix-misc.hpp(165) : error C2440: 

“=” : 無法從“double **(__cdecl *)(void) ”轉換為“double ** ” 

沒有使該轉換得以執行的上下文

這隻是其中兩個,其它錯誤類似。原始代碼未經修改怎麼會出錯?怎麼辦?還好,作者給了我們原因及解決辦法:http://sourceforge.net/forum/forum.php?thread_id=1374927&forum_id=267868

>d:\cpplapack\include\dgematrix-\dgematrix-misc.hpp(163):error C2061: syntax error: 'A' 

This is because of the bug of VC7. 

However, you can compile CPPLapack programs with a few slight modifications. 

Change the "swap" functions in "*-misc.hpp" like the following.

double** A_darray(A.Darray); 

==> double** A_darray=A.Darray;

就是說這是VC7的bug,看來問題不在我們,不在代碼,當然也不在作者,而在微軟,誰讓微軟的C++編譯器對标準C++的支援就那麼差勁呢(STL是另外一個著名的例子,比如模闆的偏特化,還有一個例子是友元函數),著名的、風靡一時、擁有無數使用者的VC6.0對标準C++的支援僅有83.43%(gcc是96.15%,差距啊),到了VC7,據說到了98.22%,不知是不是噱頭,但就cpplapack的編譯看來似乎……

繼續閱讀