2016-03-07 73 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選項,提供庫的位置,如果它安裝在默認位置,它不是必需的。