2016-10-18 2 views
0

BLASとLAPACKがFortranでどのように動作しているかを理解しようとしているので、行列を生成して反転するコードを作った。LAPACKとBLASサブルーチンへの未定義の参照

は、ここで私が呼んでいるファイル内の行列Aがあるコード

program test 
Implicit none 
external ZGETRF 
external ZGETRI 
integer ::M 
complex*16,allocatable,dimension(:,:)::A 
complex*16,allocatable,dimension(:)::WORK 
integer,allocatable,dimension(:)::IPIV 
integer i,j,info,error 

Print*, 'Enter size of the matrix' 
Read*, M 

Print*, 'Enter file of the matrix' 
READ(*,*), A 

OPEN(UNIT=10,FILE = '(/A/)' ,STATUS='OLD',ACTION='READ') 

allocate(A(M,M),WORK(M),IPIV(M),stat=error) 
    if (error.ne.0)then 
     print *,"error:not enough memory" 
     stop 
    end if 

!definition of the test matrix A 
    do i=1,M 
    do j=1,M 
    if(j.eq.i)then 
     A(i,j)=(1,0) 
    else 
     A(i,j)=0 
    end if 
end do 
end do 

call ZGETRF(M,M,A,M,IPIV,info) 
if(info .eq. 0) then 
    write(*,*)"succeded" 
else 
    write(*,*)"failed" 
end if 

call ZGETRI(M,A,M,IPIV,WORK,M,info) 
    if(info .eq. 0) then 
    write(*,*)"succeded" 
else 
    write(*,*)"failed" 
end if 
deallocate(A,IPIV,WORK,stat=error) 
if (error.ne.0)then 
    print *,"error:fail to release" 
    stop 
end if 
close (10)  
end program test 

だ、とも私は行列(M)の大きさを言います。私はのgfortranでそれらをcopileときに私は私が正しい方法ライブラリで呼んでいる場合ので、私は知りませんがインストールBLASとLAPACKをインストールしているこれらのメッセージ

/tmp/ccVkb1zY.o: In function MAIN__': test.f03:(.text+0x751): undefined reference to zgetrf_' test.f03:(.text+0x85d): undefined reference to `zgetri_' collect2: error: ld returned 1 exit status

を取得します。

提案がありますか?

+0

次のコンパイル・コマンドを与えることができますか? – ztik

+0

いいえ、できませんでした。コンパイルしようとするとエラーが発生します – Daniel

+0

[gfortran LAPACKの "未定義参照"エラー(https://stackoverflow.com/questions/20669410/gfortran-lapack-undefined-reference-error)の可能な複製 –

答えて

0

あなたがライブラリにリンクしていない可能性があります。試してみてください:

gfortran -o test test.f03 -llapack -lblas 

をこれは、リンカ(すべてのプログラム部分を一緒に参加するプログラム。通常、UNIXの「LD」と呼ばれる)が原因とLAPACKコール(またはそれへのダイナミックリンク)のためのライブラリコードを含めるようにしてあなたのプログラム。

上記の行の結果が「-llapack見つけることができない」、または類似している場合、2つの一般的な問題があります

  1. ライブラリは、 『「共有」(名前は「.soのを』エンディング)、またはすることができます静的 "(名前は" .a "で終わる)。あなただけがライブラリリンクの前に「-static」を追加しなければならない静的なものを持っているので、もしリンカは、共有のいずれかになります

    gfortran -o test test.f03 -static -llapack -lblas 
    

    これはまた、それはBLASの静的なバージョンのために見えるようになります。あなたが共有バージョンが必要な場合は、 "-lblas" の前に "-shared" を追加:

    のgfortran -oテストtest.f03 -static -llapack -shared -lblas

    あなたはthis pageが参考に見つけるかもしれません。

  2. リンカーはライブラリの正しいディレクトリを探していません。実際のライブラリ( "liblapack.so"や "liblapack.a"などと呼ばれる)を見つけて、それが入っているディレクトリがリンカが探しているディレクトリに含まれていることを確認する必要があります。それは同様に「/ MYLIBS /数学」で見て取得する:

    gfortran -o test test.f03 -L/mylibs/maths -llapack -lblas 
    
関連する問題