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

  最近使用cppLapacknmake運行正常,在Release模式下也編譯運行正常,在Debug
式下也能編譯經過,但一運行就彈出一個對話框,提示沒有找到
MSVCR90D.dll,程序未能啓
動,而若是把該
DLL拷貝到系統目錄或當前目錄下,又會出現另外一問題,提示說Debug Error,我都瘋掉了,程序是示例程序,沒有錯的,但究竟哪裏錯了呢?
php


圖1:  找不到 MSVCR90.dll
圖2:更多的錯誤
圖3:解決方法之一



圖4:解決方法之二

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

1.         在「屬性」->C/C++->「代碼生成」->「運行時庫」裏面設爲「多線程DLL」。數組

2.         在程序裏添加這一行奇怪的代碼:多線程

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

    由以上表現可知問題出在Debug模式裏,又搜索了DebugRelease模式的區別,獲得的答案是:ide

實際上,"Debug""Release"只是兩套IDE預先設定好的編譯參數和宏定義組合(例如咱們常常遇到的_DEBUGNDEBUG宏)。編譯 器並不知道DebugRelease之分(不過MDMDd編譯參數會區分Debug版本和Release版本的運行時庫)。當混用用Debug設置編譯的程序和Release版本的運行時庫的時候,因爲它們生成的時候使用的是兩套不一樣的編譯選項,所以很是可能互不兼容。函數

         另外,STLDebugRelease模式下性能有較大的差別,因此測試STL是最好在Release模式下。性能

         再說一說cppLapack,因爲最近要作矩陣運算因此使用了這個東西。它是一個小日本寫的,封裝了lapack(著名的線性代數庫,這個你們都知道了吧)一些經常使用的函數,注意是經常使用而不是所有。lapack性能雖然沒得說,但接口不是很友好,使用起來有些不方便。cppLapacksourceforge上的一個開源項目,主頁爲 http://cpplapack.sourceforge.net/ ,它的接口比較好用,性能也還不錯,還獨有「Smart-Temporary」系統以最小化臨時變量(其實是一些數組)的複製,其實就是儘可能重複使用內存以提升效率。但它數據類型有限,並且限制只能爲double,不能使用float,矩陣功能也有限,只能解決一些基本的線性代數問題,如轉置、矩陣乘積、求逆、解線性方程等,要是拿來作共軛梯度就不行了(這要靠Intel MKL,有空再說)。測試

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

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;

就是說這是VC7bug,看來問題不在咱們,不在代碼,固然也不在做者,而在微軟,誰讓微軟的C++編譯器對標準C++的支持就那麼差勁呢(STL是另一個著名的例子,好比模板的偏特化,還有一個例子是友元函數),著名的、風靡一時、擁有無數用戶的VC6.0對標準C++的支持僅有83.43%gcc96.15%,差距啊),到了VC7,聽說到了98.22%,不知是否是噱頭,但就cpplapack的編譯看來彷佛……

         言歸正傳,繼續說cpplapack的編譯,既然有錯,就要改。方法是將「-misc.hpp」文件裏的 double** A_darray(A.Darray); 改成double** A_darray=A.Darray; 不錯,官方答案就是可靠,OK,編譯經過。

         cpplapack還有一點讓人不爽的地方:它的文檔所有是html文件,是由doxygen自動生成的,使用起來還不錯,只是這些文件太多了,又小又多,佔用大量磁盤空間,形成大量磁盤碎片,在個人電腦裏有13M之多,因而QuickCHM一下,這回好多了,只有1.52M,方便存儲方便查看。其實chm文件仍是有不少優勢的,很老實的說。

         最後,cpplapack須要blasclapack庫,須要另外下載。我將修改後的源代碼、編譯後的CHM幫助文件以及這兩個庫打包打包放在了網上,有須要的能夠直接下,省去一堆麻煩,最重要的是那種面對一堆compile error時的鬱悶無與助。此cpplapack2005_03_25版本。點此下載(3.5M

http://www.rayfile.com/files/62c15f28-118b-11de-8714-0014221b798a/

相關文章
相關標籤/搜索