1. 程式人生 > >GNU/LINUX科學計算庫GSL安裝及測試

GNU/LINUX科學計算庫GSL安裝及測試

GSL簡介

GSL(GNU Scientific Library)是一個應用廣泛的C/C++科學計算庫,其包含了大量高效的數學函式。本文將簡單介紹Linux作業系統下GSL庫的安裝和測試。

 

GSL安裝

  • 從GSL官方給出的下載點(http://mirrors.ustc.edu.cn/gnu/gsl/),選擇適當的版本下載(其中,gsl-latest.tar.gz是最新版本,推薦)。使用命令
    $ tar –zxv –f your_file_name
    解壓,解壓完畢後進入解壓出的資料夾gsl-version_number。安裝過程是標準的三步走,如下。
  • 首先使用命令配置編譯資訊:
    $ [sudo] ./configure [--prefix=your_path]

    其中[ ]內為可選命令。root使用者可用sudo指令(Ubuntu作業系統下),非root使用者請忽略;而your_path可用來指定安裝位置,預設的安裝位置通常是/usr/local(需要root許可權)。非root使用者無法安裝到/usr/local,必須自己指定--prefix。
  • 相繼使用命令編譯和安裝GSL庫
    $ [sudo] make
    $ [sudo] make install

    來編譯安裝GSL庫。安裝完成後,在指定的安裝位置your_path內將會出現bin、lib、include三個資料夾,分別用來存放GSL的命令列指令、函式庫和標頭檔案。

GSL相關環境變數的設定

  • 按上面步驟安裝完成後,就可以使用GSL庫了。但是,為了使得編譯器能夠找到GSL標頭檔案和庫檔案位置,在編譯自己的程式時需要用指令-I指定標頭檔案包含路徑,用指令-L指定GSL庫檔案位置,並用-l連線上GSL的庫函式(gsl函式庫和gslcblas線性代數庫)。也就是說,編譯的命令應該像下面這樣(編譯器可以是gcc/g++):
    $ gcc –Lyour_path/lib –Iyour_path/include  your_code –lgsl –lgslcblas

    其中your_path就是上面提到的GSL安裝路徑,your_code是你自己的程式碼(可以使用下面的例子)。需要注意的是-lgsl -lgslcblas要放在編譯指令的最後,否則有些編譯器可能會報錯。另外,某些老版本的編譯器可能還要在最後加上-lm來連線基本數學庫。有些時候,如果你使用了c99特性,還需要在編譯時新增-std=c99指令。這樣,可以得到一個可執行檔案a.out。
  • 有的時候,你可能覺得每次編譯時都使用-I和-L有點麻煩,這時候可以設定環境變數。在自己的配置檔案裡(例如,利用指令$ vi ~/.bashrc開啟自己的配置檔案),在最後面加上:
    export C_INCLUDE_PATH=$C_INCLUDE_PATH:your_path/include
    export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:your_path/include
    export LIBRARY_PATH=$LIBRARY_PATH:your_path/lib

    然後重啟命令列(或者利用指令$ source ~/.bashrc讀取配置檔案)。這樣,再編譯的時候就不需要指定編譯器/聯結器搜尋路徑了(其中,CPLUS_INCLUDE_PATH是C++的標頭檔案找尋路徑,如果你只使用C語言,可以不必配置該環境變數)。然後,編譯指令就可以簡單寫為
    $ gcc your_code –lgsl –lgslcblas
  • 最後,執行可執行檔案./a.out前,需要將GSL的函式庫路徑加入到LD聯結器的連線路徑,以保證動態連結的庫能夠被查詢到:
    $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your_path/lib
    為了方便,也可以把這行指令寫到配置檔案裡去。
  • 這樣,我們就完成了GSL的安裝和環境變數的設定工作,現在可以盡情享受科學計算的樂趣了!

 

一個簡單的例子

下面給出一個簡單的示例程式碼,如下:

複製程式碼

/*example.c*/
#include <stdio.h>            
#include <gsl/gsl_sf.h>        // header: GSL special functions

int main(int argc, char const *argv[])
{
  // inputs for special functions
    double x[5] = {1.,2.,3.,4.,5.};
  // calculate zero-order Bessel function at given points
    for (int i = 0; i < 5; ++i){
        printf("J0(%.3f) = %.3f\n", x[i], gsl_sf_bessel_J0(x[i]));
    }
    return 0;
}

複製程式碼

上面的程式碼計算了0階貝塞爾函式在五個點處的函式值。輸出如下:

J0(1.000) = 0.765
J0(2.000) = 0.224
J0(3.000) = -0.260
J0(4.000) = -0.397
J0(5.000) = -0.178

更多的用法,推薦參考GSL的使用者手冊(https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf),裡面詳細介紹了各種庫函式的用法,並有相應的例子。