2016-10-18 6 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 때 나는이 메시지를받을

/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

내가 BLAS 설치 및 LAPACK 내가 올바른 방법 도서관에서 전화를했는지 모르겠 그래서 설치.

의견이 있으십니까?

+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 찾을 수 없습니다"또는, 두 가지 일반적인 문제는 비슷한 있습니다 :

  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