贡献者: addis
GNU Scientific Library (GSL) 是一个 GNU 开源项目,由 C 语言写成。
在 Debian/Ubuntu 系统上可执行 sudo apt install libgsl-dev
安装。
第二种方法是自己下载源码编译。
参考资料。gsl 通常的使用方法是先安装,生成 include 文件夹 (含有所有头文件) 和 lib 文件夹 (.so 文件以及 .a 文件). 先下载最新版安装包, 目前是 gsl-2.5.tar.gz
, 解压命令 tar -xvzf gsl-2.5.tar.gz
, 得到 gsl-2.5 文件夹, cd gsl-2.5
, 然后 ./configure --prefix=安装目录
其中安装目录只能是绝对目录. 然后 make
, 安装好以后 make check
检查, 然后 make install
即可. 只有最后一步会在安装目录中生成文件.
// example.c
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
int main (void) {
double x = 15.0;
double y = gsl_sf_bessel_J0 (x);
printf ("J0(%g) = %.18e\n", x, y);
return 0;
}
要编译, 用 gcc -Wall -I 安装目录/include/ -c example.c
要 link, 用
gcc test.o -Wl,-rpath,安装目录/lib -L 安装目录/lib -lgsl -lgslcblas -lm
其中 gsl 包含所有 gsl 的函数, gslcblas 提供了一个 cblas, 但也可以用其他更优化的如 ATLAS 提供的, m 是编译器的 math library.
以下试图使用 apt 直接安装 gsl
sudo apt-get install libgsl
再按两次 tab 即可显示所有相关包
locate libgsl.so
或者 locate libgsl
就能找到所有 so
文件(貌似找不到 a
文件),只好放弃
gsl 完全是 c 语言写的, 所以 cuda 应该也是以用的, 但是不能用编译好的 a 和 so, 而是要重新由源码编译. 即使不用 cuda, 直接使用源码也可以让代码更 portable.
用 understand 分析了一下 bessel
和 3j
symbol 两个函数, 发现如果不修改代码, 要找到编译某个函数需要的所有文件真的很难, 至少有几十个文件. 其中有一个比较特殊的文件是 config.h
, 应该是要运行安装包的 config 以后才会生成的.
我觉得可以把所有的头文件和 c 文件都放在一个文件夹里面, 然后做一个类似 SCID_TDSE
的 makefile, 自动分析出 dependency. 不过 c 和 fortran 不同,要做到自动还是很有难度的. 不知道 understand 有没有这个功能. 如果不行, 干脆就所有 c 文件都编译? 又或许安装包里的 makefile 已经有 dependency list 了.
然后又发现 gsl 安装的就是所谓的 two-step process: configure followed by make.
用 git 对比了一下安装过程的源码, 发现安装过程并不会改变任何源码(.c 和 .h 文件), 只会根据系统生成 "config.h", 其实也可以直接手动修改该文件, 主要是一些宏的定义和取消, 注释非常易懂. 所以理论上, 只要把所有源码文件都放到一起编译就可以了.
以下介绍如何使用用 CMake 和 Visual Studio 2017 编译 lib 和 dll 以及测试文件(貌似测试的时候有一项会 fail)
cmake -G"Visual Studio 15 2017 Win64" -DGSL_INSTALL_MULTI_CONFIG=ON \
-DBUILD_SHARED_LIBS=ON -DMSVC_RUNTIME_DYNAMIC=ON \
<path to gsl sources>
x64
, Visual Studio 2017
,native generator
。成功以后按照上面的选项勾选 GSL_INSTALL_MULTI_CONFIG=ON
BUILD_SHARED_LIBS=ON
MSVC_RUNTIME_DYNAMIC=ON
,然后点 generate 即可。
sln
文件,双击打开 Visual Studio 2017,选 Release,确认是 x64,然后在菜单中 Build -> All 即可。
bin/Release/gsl.dll
,lib 文件在 Release/gsl.lib
,头文件在 gsl
中。
CTest -VV
即可(-VV
是 extra verbose)
如果要临时关闭一些 trivial 的异常(比如 exp(-x) 对于大 x 会 underflow 异常),用 gsl_set_error_handler_off()
要恢复默认的异常处理,用 gsl_set_error_handler(NULL)
详见这里。