GNU/LINUX科学计算库GSL安装及测试


原文出处: 小遥子的博客

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默认用系统编译器ccO2优化等级来编译,如果需要换编译器或者改优化等级,可以参考安装文件里的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_PATHC语言编译器的头文件查找路径,只使用C++的可以不指定。CPLUS_INCLUDE_PATHC++的编译器头文件查找路径,只使用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.hGSL特殊函数的头文件。上面的代码计算了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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值