最近使用cppLapack,nmake運行正常,在Release模式下也編譯運行正常,在Debug模
式下也能編譯經過,但一運行就彈出一個對話框,提示沒有找到MSVCR90D.dll,程序未能啓
動,而若是把該DLL拷貝到系統目錄或當前目錄下,又會出現另外一問題,提示說Debug Error,我都瘋掉了,程序是示例程序,沒有錯的,但究竟哪裏錯了呢? php
因而百度之,首先找到一個答案說這是Visual Studio 2008安裝在FAT32分區下的bug,轉換爲NTFS就好了,但這顯然不是我想要的,由於個人硬盤全都是NTFS的;因而繼續google,找到一篇文章,,說是要在配置裏忽略掉MSVCRT庫,我試了一下問題依舊;繼續google,這回找到MSDN上了,MSDN說是沒有安裝VC運行庫,因而我又從microsoft上下回來VC運行庫,安裝,問題依舊。快要瘋了。繼續google+baidu,功夫不負有心人,終於讓我找到了答案,現記錄在此,供參考。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模式裏,又搜索了Debug與Release模式的區別,獲得的答案是:ide
實際上,"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吧:ui
c:\cpplapack\cpplapack\include\dgematrix-\dgematrix-misc.hpp(163) : error C2061: |
這只是其中兩個,其它錯誤相似。原始代碼未經修改怎麼會出錯?怎麼辦?還好,做者給了咱們緣由及解決辦法: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' |
就是說這是VC7的bug,看來問題不在咱們,不在代碼,固然也不在做者,而在微軟,誰讓微軟的C++編譯器對標準C++的支持就那麼差勁呢(STL是另一個著名的例子,好比模板的偏特化,還有一個例子是友元函數),著名的、風靡一時、擁有無數用戶的VC6.0對標準C++的支持僅有83.43%(gcc是96.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須要blas和clapack庫,須要另外下載。我將修改後的源代碼、編譯後的CHM幫助文件以及這兩個庫打包打包放在了網上,有須要的能夠直接下,省去一堆麻煩,最重要的是那種面對一堆compile error時的鬱悶無與助。此cpplapack是2005_03_25版本。點此下載(3.5M)
http://www.rayfile.com/files/62c15f28-118b-11de-8714-0014221b798a/