1. 程式人生 > >VS2012和GSL數值計算庫配置

VS2012和GSL數值計算庫配置

由於要將自己演算法轉換成C++版本的在實際中使用,演算法中有解非線性方程,向量,矩陣運算等等,C++中可沒有這些東東,自己編寫,呵呵。最後找來找去,發現有用來數值計算的C庫,我們可以下載並且呼叫相關的庫。網上相關的C++庫很多,但是比較全面的,既能做線性運算,又能非線性運算,複數運算,一些優化演算法,變換方法等等的C庫還真不多,GSL是公認的比較好的。其他的庫要麼只能線性運算,要麼就是有各種問題,雖然GSL效率不是最好的,但是還可以用,再說其中包含的計算功能很多,如下表所列:



功能還是很全的,有這個庫,在C++下實現演算法還是很有利的。好了,廢話這麼多,接下來說明如何配置這個庫,在網上找了諸多資料,說的都不詳細,或者就是時間太久了,基本都是在32位XP系統下做的配置,在64位windows7電腦上無法工作也看到有很多網友留言,這個庫很難配置成功,基本上沒成功使用。接下來我就一步步解釋如何配置這個庫:    (1) 下載在windows下使用的GSL庫,地址:

下載如下圖片中所示的兩個檔案:

(Complexpackage, except sources Setup, Sourece Setup)



下載完成後就是安裝,這個不必說了,我的安裝路徑是:D:\Program Files (x86)\GnuWin32

(2)安裝完成後,在目錄D:\ProgramFiles (x86)\GnuWin32\src\gsl\1.8\gsl-1.8\VC8下找到libgsl.sln檔案,然後開啟,如下圖:在資源管理器中可以看到如下4個專案。



(3)把該工程的四個專案的四個版本,(即上圖所示)版本全部編譯(重新生成)一遍:(相當於重新生成16遍,可能有點慢),如下圖:



(4)然後到該專案對應的生成的lisgsl和libgslcblas資料夾下(在路徑D:\ProgramFiles (x86)\GnuWin32\src\gsl\1.8\gsl-1.8\VC8),找對應的Debug-DLL,Debug-StaticLib,Release-DLL,Release-StaticLib,把其中所有的.lib(共8個)和.dll(共4個)檔案考出來,其中.lib(共八個)檔案拷貝到和src同一級的lib檔案中,.dll檔案 (共四個)放到你的環境目錄可訪問(如system32)或你的工程檔案中。例如我的lib檔案就放入和src同一級的lib檔案中了,dll檔案我也放入其中了。








接下生成就OK了,現在生成了可以供我們自己電腦使用的dll和 lib庫了,接下來配置。

(5)新增環境變數到:



(6)新建一個win32控制檯應用程式,在專案屬性裡面配置:

VC++目錄:(按照自己的安裝路徑新增)

可執行檔案:D:\Program Files (x86)\GnuWin32\bin

包含檔案:D:\Program Files (x86)\GnuWin32\include

庫目錄:D:\Program Files (x86)\GnuWin32\lib

源目錄:D:\ Program Files (x86)\GnuWin32\src\gsl\1.8\gsl-1.8



聯結器----輸入----附加依賴項:新增 libgsl.lib;libgslcblas.lib;libgsl_d.lib;libgslcblas_d.lib


OK,現在就配置完成了。我們可以寫一個例子來看看了。

由於GSL計算能力好,但是顯示計算結果非常不方便,於是有人開發了基於GSL的MYGSL數值計算庫,已經都編譯好了lib和dll,但是非常不穩定,此外版本還停留在XP系統的版本上,並且是32位的,好久沒跟新了,在64位電腦上用會出現莫名的錯誤,但是他方便之處是計算的結果很容易顯示,這個功能還是正常的,因此我們計算的時候呼叫GSL庫,顯示結果的時候呼叫MYGSL庫,當然這也需要配置MYGSL庫,如何配置?可以看我以前空間裡日誌,裡面有詳細介紹,這裡就不重複介紹了。

#include <stdio.h>

#include <gsl/gsl_vector.h>

#include <gsl/gsl_complex_math.h>

extern "C"

{

    #include <my++/myhead.h>

}

int main(void)

{

    gsl_vector_complex*x=gsl_vector_complex_alloc(1);

    gsl_complexy=gsl_complex_rect(3,4);

    gsl_vector_complex_set(x,0,y);

    printline(30);

    printComplex(y);

    printline(30);

    gsl_vector_complex_free(x);

    return 0;

}

執行結果如下:這裡就是一個簡單的例子,定義並且顯示一個複數。配置完成後,OK,騷年們,開始程式設計吧。