使用 C 访问 GSL 库

Accessing GSL library with C

我已经使用 sudo apt install libgsl2 command.However 安装了 gsl 库,当我 运行 下面的程序使用 gcc 时,

#include<stdio.h>
#include<math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
double x;
double nu;
int main(){
x=4;
nu=2;
double chi;
chi=gsl_cdf_chisq_P (double x, double nu);
printf("%lf",chi);
}

我用gcc -o file编译时出现如下信息filename.c

gsl/gsl_rng.h: No such file or directory
compilation terminated.

我在安装过程中是否遗漏了任何步骤?或者在编译过程中是否需要使用任何标志?

您需要安装 libgsl-dev 包。

此包包含开发所需的包含文件。

如有疑问,请查看包中的文件列表

$ dpkg -L libgsl2
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libgsl.so.19.0.0
/usr/lib/x86_64-linux-gnu/libgslcblas.so.0.0.0
/usr/lib/x86_64-linux-gnu/libgslcblas.so.0
/usr/lib/x86_64-linux-gnu/libgsl.so.19
/usr/share/doc
/usr/share/doc/libgsl2
...
just doc files and nothing more

使用 dev 软件包,您可以获得

$ dpkg -L libgsl-dev
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libgsl.a
/usr/lib/x86_64-linux-gnu/libgslcblas.a
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/gsl.pc
/usr/include
/usr/include/gsl
...
and all the header files here

dev 包为您提供了所有必要的 headers 和在静态构建情况下有用的静态导入库。

P.S。与 libgsl2 相比,不要因为 libgsl-dev 包名称中缺少 2 而被推迟。两者在您的 Ubuntu 系统或其衍生版本上都是相同的 2.x 版本。

P.P.S。您的代码还有一些问题。

您正在使用的函数 gsl_cdf_chisq_P() 属于 CDF 函数的 collection,因此您需要包含 <gsl/gsl_cdf.h>。并且您需要将函数正确调用为 gsl_cdf_chisq_P (x, nu) 而不是 gsl_cdf_chisq_P (double x, double nu).

生成的代码可能如下所示:

#include<stdio.h>
#include<math.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>

int main(){
    double x=0.05;
    double nu=9;
    double chicdf, chi;
    chi=gsl_cdf_chisq_Pinv (1-x, nu);
    chicdf=gsl_cdf_chisq_P (chi, nu);
    printf("ICDF[Chisquared<%d>](1 - %lf) = %lf\n" 
           "CDF[Chisquared<%d>](%f) = %lf\n",
                (int)nu,x,chi,(int)nu,chi,chicdf);
    return 0;
}

编译它运行

gcc -Wall -O2 testchisq.c -o testchisq -lgsl -lgslcblas -lm 

它应该打印

ICDF[Chisquared<9>](1 - 0.050000) = 16.918978
CDF[Chisquared<9>](16.918978) = 0.950000