原文出处: 小遥子的博客
GSL简介
GSL(GNU Scientific Library)是一个应用广泛的C/C++科学计算库,是GNU开源项目的一部分,是完全免费的。GSL包含了大量高效的数学函数,例如基本的数学函数、复数运算、特殊函数、线性代数计算、本征值求解、随机数产生、统计函数、插值、数值微分和积分等等,是进行科学计算很好的选择。本文将简单介绍Linux操作系统下GSL库的安装和测试。
GSL的安装、调试和详细的用户文档都可在GSL官网下载到,它们是学习使用GSL最佳的工具。GSL的用户手册详细介绍了各种库函数的用法,并有相应的例子。
GSL安装
下载和编译
从GSL官方给出的下载点,选择适当的版本下载(其中,gsl-latest.tar.gz是最新版本,推荐)。按以下步骤安装:
解压:下载后,将得到的一个压缩包,名称与所选版本有关(假设压缩包名为compressed_file_name),在Shell中使用下面的命令解压:
$ tar -zxv -f compressed_file_name
其中,tar是一个打包软件,选项z表示压缩文件是gzip格式,x表示解压操作,v表示打印被解压文件名称
解压完毕后进入解压出的文件夹gsl-version_XXX(文件夹名称与版本有关)。进入下面的标准的三步走安装步骤,即配置、编译、安装。如果在任何一步报了错,推荐的方法是把解压出来的文件夹删掉、重新解压。
配置:首先使用命令配置编译信息:
$ ./configure --prefix=your_target_path
其中,--prefix
是用来指定安装位置(请在任意位置新建一个文件夹,假设名为your_target_path
,则用--prefix=your_target_path
指定安装位置。安装后,相应的头文件和库文件会被移动到该文件夹内。文件路径请不要包含任意中文字符)。
- 请确保用户对指定的安装路径具有权限。如果权限报错,用户可用
sudo
指令(Ubuntu操作系统下)来执行特权命令,即$ sudo ./configure --prefix=your_target_path
,后面的几步同理。不知道root密码的用户只能安装到具有权限的位置; - 如果不用
prefix
指定安装位置,默认的安装位置通常是/usr/local
。这需要root权限。我们不推荐这样做。 configure
默认用系统编译器cc
以O2
优化等级来编译,如果需要换编译器或者改优化等级,可以参考安装文件里的README或者INSTALL。
编译: 使用命令编译GSL库:
$ make
这实际上是利用configure
过程生成的Makefile
文件来一步一步编译。请耐心等待,可能需要较长时间。如果没有报错,可以进行最后一步。
安装:
$ make install
这实际上是把头文件、库文件和可执行文件放到了指定的安装位置your_target_path
。这时your_target_path
内将会出现bin、lib、include三个文件夹,分别用来存放GSL的可执行文件、函数库和头文件,此时安装已经完成。
- 可执行文件是用户可以直接在shell里调用的指令,用来获取gsl的一些基本功能,比如得到版本信息等等。通常没什么用。
- 库函数是用户编译程序和装载程序时需要链接的库。
- 头文件则是用户在写程序时需要包含的。
GSL相关环境变量的设置
按上面步骤安装完成后,就可以使用GSL库了。但是,为了使得编译器能够找到GSL头文件和库文件位置,需要一些额外的设定。一般来讲有两个方法,下面都介绍一下。
通过shell环境指定
如果你经常使用GSL,最简单的方法是设置环境变量以直接指定库和头文件查找路径。在自己的配置文件里(通常是家目录~下的.bashrc文件,可以用文本编辑器打开,例如vi ~/.bashrc
),在最后面加上:
export C_INCLUDE_PATH="${C_INCLUDE_PATH}:your_target_path/include"
export CPLUS_INCLUDE_PATH="${CPLUS_INCLUDE_PATH}:your_target_path/include"
export LIBRARY_PATH="${LIBRARY_PATH}:your_target_path/lib"
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:your_target_path/lib"
其中需要把your_target_path
替换成安装时指定的安装路径。我们简单解释一下这里的配置:
C_INCLUDE_PATH
是C
语言编译器的头文件查找路径,只使用C++
的可以不指定。CPLUS_INCLUDE_PATH
是C++
的编译器头文件查找路径,只使用C
的可以不指定。后面两行分别是编译时的库查找路径,和装载时的库查找路径。- 由于shell里运行的程序都继承shell的环境,所以通过shell来编译的时候,编译器继承了shell的环境,就知道去哪里查找头文件和库文件了。但是,如果你是通过其他的非
bash
的shell来编译,就需要改相应的配置文件而不是~/.bashrc
。
改完配置文件后,重启shell(不要使用source ~/.bashrc
或. ~/.bashrc
来重载配置文件,这样并不安全),然后就可以编译了。
可以使用我们在本文后面提供的一个例子example.c
来尝试。用文本编辑器新建一个文件example.c
,把例子里的代码copy进去,然后在shell里编译:
$ gcc example.c -lgsl -lgslcblas
编译后应该会产生一个名为a.out
的文件(a.out
源于BSD UNIX下的汇编输出文件,意思是assembler output
)。在shell里运行$ ./a.out
看有没有输出就行了。需要注意的是
- 需要注意的是
-lgsl -lgslcblas
(链接gsl函数库和gslcblas线性代数库)要放在编译指令的最后,并且顺序不能颠倒,否则有些编译器可能会报错。另外,某些老版本的编译器可能还要在最后加上-lm来连接基本数学库。 - 有些时候,如果你使用了c99特性,还需要在编译时添加
-std=c99
指令。也可以加上-Wall
来打开各种警告,还可以用-O2
来优化代码速度。 - 如果是用
C++
编译器,例如g++
,就可以用g++ example.c -lgsl -lgslcblas
,相应的也可以加上-stc=c++11
,-Wall
,-O2
.
编译时指定
如果你不想通过shell环境来指定头和库的查找路径,或者不经常使用GSL的话,可以在编译的时候来临时指定头和库的查找路径。首先,还是得改配置文件,但是只用加入一句话:
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:your_target_path/lib"
而在编译自己的程序时,例如上面提到的examplc.c
,就需要用指令-I
指定头文件查找路径,用指令-L
指定GSL库文件查找位置。也就是说,编译的命令应该像下面这样:
$ gcc -Lyour_target_path/lib -Iyour_target_path/include example.c -lgsl -lgslcblas
其中需要把your_target_path
替换成安装时指定的安装路径。这样,成功编译后还是可以得到一个可执行文件a.out
。$ ./a.out
运行即可。
这样,我们就完成了GSL的安装和环境变量的设置工作,现在可以尽情享受科学计算的乐趣了!
一个简单的例子
下面给出一个简单的C语言示例代码,如下:
/*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;
}
GSL
的头文件使用方法有点特别,一般是gsl/xxxx.h
的形式,这是官方推荐的形式。gsl_sf.h
是GSL
特殊函数的头文件。上面的代码计算了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