2014-10-29 54 views
0

我想使用LAPACK函數從C未能鏈接C代碼LAPACK:未定義參考

下面是一些測試代碼,從this question

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
#include "clapack.h" 
#include "cblas.h" 

void invertMatrix(float *a, unsigned int height){ 
    int info, ipiv[height]; 
    info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv); 
    info = clapack_sgetri(CblasColMajor, height, a, height, ipiv); 
} 

void displayMatrix(float *a, unsigned int height, unsigned int width) 
{ 
    int i, j; 
    for(i = 0; i < height; i++){ 
    for(j = 0; j < width; j++) 
     { 
     printf("%1.3f ", a[height*j + i]); 
     } 
    printf("\n"); 
    } 
    printf("\n"); 
} 


int main(int argc, char *argv[]) 
{ 
    int i; 
    float a[9], b[9], c[9]; 
    srand(time(NULL)); 
    for(i = 0; i < 9; i++) 
    { 
     a[i] = 1.0f*rand()/RAND_MAX; 
     b[i] = a[i]; 
    } 
    displayMatrix(a, 3, 3); 
    return 0; 
} 

我編譯這個用gcc複製:

gcc -o test test.c \ 
    -lblas -llapack -lf2c 

注:我已經試過各種順序這些庫,我也嘗試過其他類似的庫latlas,lcblas,lgfortran等

的錯誤信息是:

/tmp//cc8JMnRT.o: In function `invertMatrix': 
test.c:(.text+0x94): undefined reference to `clapack_sgetrf' 
test.c:(.text+0xb4): undefined reference to `clapack_sgetri' 
collect2: error: ld returned 1 exit status 

clapack.h被發現,包括:(安裝爲圖譜的一部分)。 clapack.h包含有問題的功能---所以不能找到它們?

符號實際上在庫libalapack中(使用strings找到)。但是,向gcc命令添加-lalapack似乎需要添加-lcblas(大量未定義的cblas_ *引用)。安裝cblas會自動卸載地圖集,這會刪除clapack.h。

所以,這感覺就像某種依賴性地獄。

我在FreeBSD 10 amd64上,所有相關的庫似乎都安裝在正確的路徑上。

任何幫助非常感謝。

感謝

伊萬

+0

我已經讀過這個問題obvs - 請注意我鏈接到它。我不認爲這是重複的,而另一個問題沒有得到充分的回答。 – 2014-10-30 09:23:34

+0

它看起來並不像你已經在重複問題的答案中嘗試了建議,即將'-lcblas'添加到命令行? (哦,我的不好,我只是更仔細地重新閱讀你的問題,畢竟你提到libcblas--這沒有幫助嗎?)。無論如何,我已經收回了我的近距離投票。 – 2014-10-30 09:25:53

+0

謝謝:)對於我而言,今天早上我做了一些更多的工作,並且在錯誤消息後添加了更多的細節。 – 2014-10-30 09:30:06

回答

0

我卸載遠程一切有關--- BLAS,cblas,LAPACK,阿特拉斯等---然後重新安裝圖集(從端口)獨自一人,然後LAPACK和BLAS包。

這次,/ usr/local/lib包含一個新的lib文件:libcblas.so ---以前的隨機安裝必須刪除它。

,編譯gcc的行現在是:

gcc -o test test.c \ 
-llapack -lblas -lalapack -lcblas 

改變的-l參數的順序似乎沒有任何區別。