2016-03-07 68 views
-1

尽管程序编译成功,但计算机拒绝运行包括GSL功能在内的程序。例如,考虑作为一个例子给出的GSL网站上的以下程序:C:运行GSL功能

// Test program for GSL RNG 

#include <stdio.h> 
#include <gsl/gsl_rng.h> 

int main (void) 
{ 
    const gsl_rng_type * T; 
    gsl_rng * r; 

    int i, n = 10; 

    gsl_rng_env_setup(); 

    T = gsl_rng_default; 
    r = gsl_rng_alloc (T); 

    for (i = 0; i < n; i++) 
    { 
     double u = gsl_rng_uniform (r); 
     printf ("%.5f\n", u); 
    } 

    gsl_rng_free (r); 

    return 0; 
} 

这将编译,但后来在执行过程中提供了以下错误:

/tmp/ccPWUHlO.o: dans la fonction « main »: 
GSL_rng_test.cc:(.text+0x10): référence indéfinie vers « gsl_rng_env_setup » 
GSL_rng_test.cc:(.text+0x17): référence indéfinie vers « gsl_rng_default » 
GSL_rng_test.cc:(.text+0x27): référence indéfinie vers « gsl_rng_alloc » 
GSL_rng_test.cc:(.text+0x46): référence indéfinie vers « gsl_rng_uniform » 
GSL_rng_test.cc:(.text+0x7d): référence indéfinie vers « gsl_rng_free » 
collect2: erreur: ld a retourné 1 code d'état d'exécution 

对不起,这是在法国,但我认为你会理解这个主意。 GSL已经安装,我自己检查了头文件的存在。有人可以帮忙吗?

+0

C!= C++,并且您的标题指定C,而您的'.cc'文件扩展名似乎指示C++。一般来说,除非您提出有关不同或相似之处的问题,否则您只应标记您正在编写/编译的语言。 – crashmstr

回答

1

看来您没有正确链接GSL库。例如,如果您的GSL库的相对路径是LIB_GSL,如果你想静态链接库GSL,你需要包括一条线,看起来像这样(为GSL 1.16测试)

LIB_GSL/.libs/libgsl.a 

如果您也使用BLAS功能,并且不自行链接任何其他BLAS库,则还应链接GSL中包含的BLAS库,如果您静态链接(GSL 1.16测试):

LIB_GSL/cblas/.libs/libgslcblas.a 
0

看来你的程序没有正确链接。如果GSL库安装在默认位置/ usr/local/lib,则可能缺少支持库(CBLAs库)。 GSL还为它提供了一个库(如果你的系统没有)称为libgslcblas.a。

试试你的程序与链接:

$ gcc -L<location_of_lib> yourProgram.o -lgsl -lgslcblas -lm 

- 带有-L选项,提供库的位置,如果它安装在默认位置,它不是必需的。