GSL簡介
GSL(GNU Scientific Library)是一個應用普遍的C/C++科學計算庫,其包含了大量高效的數學函數。本文將簡單介紹Linux操做系統下GSL庫的安裝和測試。bash
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 spa
更多的用法,推薦參考GSL的用戶手冊(https://www.gnu.org/software/gsl/doc/latex/gsl-ref.pdf),裏面詳細介紹了各類庫函數的用法,並有相應的例子。操作系統