1. 程式人生 > >最強數學庫GSL(GNU Scientific Library) Qt環境下部署

最強數學庫GSL(GNU Scientific Library) Qt環境下部署

1.前言

GSL(GNU Scientific Library)是一個 C 寫成的用於科學計算的庫,有超過1000個函式,該庫提供了關於數學計算的很多方面,Matlab的大部分函式幾乎都能借助它實現,可以在數值計算中省卻很多事情。關於GSL的詳細功能。GSL的功能及相關標頭檔案的介紹可以見此偏文章:http://blog.csdn.net/augusdi/article/details/8834182,或者看看這位仁兄的blog:http://www.cnblogs.com/Jedimaster/archive/2008/06/22/1227656.html , GSL說明文件的目錄翻譯見這裡:http://blog.csdn.net/yruilin/article/details/3986844

 ,大家在需要實現某個數學功能的時候,不妨先參考參考GSL。

GSL的在Windows平臺下的配置有好多文章,像常用的vc6到vs2010,都有許多參考文章,這裡就不一一羅列,大家谷歌或百度一下都可以找到,但是唯獨沒有Qt環境下的配置(至少我沒看到),雖然Qt和vs下配置大同小異,但是為了方便各位,還是覺得有必要寫一篇進行說明。

2.獲取GSL

下載地址:http://gnuwin32.sourceforge.net/packages/gsl.htm

這個頁面下有6個內容可以下載,省事直接下載第一個“Complete package, except sources”即可。不想安裝包的可以下載“Binaries”和“Developer files”,這兩個裡面包含了編譯好的dll以及.a和def檔案(唯獨沒有lib~~)。如果此網被牆,可以見此文最後的附件。

無論怎麼下載,gsl的目錄都如下圖所示:

我們將會用到“bin”目錄下的dll,“lib”目錄下的……def檔案,(官方沒有提供lib檔案……),以及“include”目錄下的標頭檔案

 

3.生成lib檔案

由於官方沒有提供lib檔案,因此需要自己生成,通過def檔案生成lib檔案的方法有很多,百度谷歌一大堆,這裡還是說一下:

1. 開始選單,點選執行,輸入cmd

2.進入gsl庫的lib目錄下依次輸入以下兩條語句:
    lib /machine:i386 /def:libgsl.def
    lib /machine:i386 /def:libgslcblas.def

再看lib目錄下,發現有了libgsl.lib,libgslcblas.lib這兩個檔案。

 

4.Qt環境下配置gsl

有dll,有lib,有標頭檔案。萬事具備,就差qmake了。

開發的過程中只需要用到“lib”目錄下的libgsl.lib,libgslcblas.lib這兩個lib檔案,以及include目錄下的標頭檔案。執行時需要用到bin目錄下的兩個dll檔案,為了程式開發的擴充套件性,我們可以直接在需要用到gsl的工程目錄中新加gsl資料夾,在這個資料夾裡把include資料夾和lib資料夾拷貝過去。

上圖所示:在某工程裡建立一個gsl資料夾,把include和lib檔案拷貝到此資料夾下,此時結構如下:

project

|_gsl

|_include

| |_gsl

| |_標頭檔案

|_lib

|_ libgsl.lib 、libgslcblas.lib

為了能匯入include裡的標頭檔案需要在pro檔案中如下寫:

 

 
  1. INCLUDEPATH += $$PWD\gsl\include

  2. LIBS += -L$$PWD\gsl\lib -llibgsl

  3. LIBS += -L$$PWD\gsl\lib -llibgslcblas

這樣就可以使用GSL了,非常簡單。但是,有些函式需要使用dll,因此,為了不帶來不必要的麻煩,需要預定義巨集GSL_DLL,因此上面的pro檔案應該如下寫:

 

 

 
  1. DEFINES += GSL_DLL

  2. INCLUDEPATH += $$PWD\gsl\include

  3. LIBS += -L$$PWD\gsl\lib -llibgsl

  4. LIBS += -L$$PWD\gsl\lib -llibgslcblas


這時就完全OK了。

 

可以試試下面的程式碼:

H:

 

 
  1. #include <gsl/gsl_sf_bessel.h>

  2. #include <math>

  3. #include<iostream>


CPP:

 
  1. int main()

  2. {

  3. double x =5.0;

  4. double y =gsl_sf_bessel_J0 (x);

  5. cout<< "J0("<< x <<") = " << y<< endl;

  6. return0;

  7. }


第一次執行,會直接崩潰,主要是dll沒放到生成目錄裡,把dll放到對應的目錄裡,即可正常執行。

 

 

5. 編寫GSL的PRI檔案,簡化部署步驟

得益於qmake,可以非常簡單的組織專案結構。為了方便以後呼叫,我們可以寫好一個gsl.pri檔案放在gsl目錄下,以後使用只需要include($$PWD/gsl/gsl.pri)即可。
 

 
  1. DEFINES += GSL_DLL#此句不加將會遇到一些連線錯誤

  2. INCLUDEPATH += $$PWD\include

  3. DEPENDPATH += $$PWD

  4. LIBS += -L$$PWD\lib -llibgsl

  5. LIBS += -L$$PWD\lib -llibgslcblas


 

6.視訊教程

下面是配置的視訊教程:

http://v.youku.com/v_show/id_XNzc5MjU1NzEy.html

 

通過此方法可以方便的配置很多庫,順帶附送一個Qt下配置blitz++數學庫的方法:

http://v.youku.com/v_show/id_XNjk4NDA3NDQw.html

 

7.demo下載

下載demo(包括gsl必要的dll和lib檔案):http://download.csdn.net/detail/czyt1988/7893997