使用 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
我已经使用 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