【问题标题】:Accessing GSL library with C使用 C 访问 GSL 库
【发布时间】:2018-03-15 07:22:18
【问题描述】:

我已经使用 sudo apt install libgsl2 命令安装了 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.

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

【问题讨论】:

标签: c gsl


【解决方案1】:

您需要安装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 包为您提供了所有必要的标头和静态导入库,在静态构建的情况下很有用。

附:与libgsl2 相比,libgsl-dev 包的名称中缺少2。在您的 Ubuntu 系统或其派生系统上,两者都将具有相同的 2.x 版本。

附言您的代码还有一些问题。

您使用的函数gsl_cdf_chisq_P() 属于CDF 函数集合,因此您需要包含&lt;gsl/gsl_cdf.h&gt;。并且您需要以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

【讨论】:

  • 我安装了 libgsl-dev。显示以下消息。我正在尝试使用 gsl_cdf_chisq_P 获取卡方值。这不是内置函数吗?我收到以下消息: .GOF.c:12:5: warning: implicit declaration of function ‘gsl_cdf_chisq_P’ [-Wimplicit-function-declaration] chi=gsl_cdf_chisq_P (double x, double nu); ^ GOF.c:12:22: error: expected expression before ‘double’ chi=gsl_cdf_chisq_P (double x, double nu);
  • @Natasha 你需要包含gsl/gsl_cdf.h并调用函数为gsl_cdf_chisq_P (x, nu)
  • 非常感谢您的帮助。但是我在编译:~$ gcc -Wall -O2 -lgsl -lgslcblas -lm GOF.c -o testchisq /tmp/ccDByBsq.o: In function main'时仍然遇到麻烦:GOF.c:(.text.startup+0x15): undefined reference to gsl_cdf_chisq_P' collect2: error: ld returned 1 exit status
  • @Natasha 哦,试试gcc -Wall -O2 GOF.c -o testchisq -lgsl -lgslcblas -lm 。我想知道为什么另一个订单在我的系统上工作。
  • 是的,在 Ubuntu 中,--as-needed 选项在从gcc 调用时被添加到collect2 命令行。在其他发行版中,此选项被省略,因此可以在源文件名之前列出库名。这是内部机制。这意味着ubuntu上的源文件名应该在-l选项之前列出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2013-09-19
  • 2019-11-14
  • 2012-09-09
相关资源
最近更新 更多