从英特尔MKL链接LAPACK与gfortran
我有一个问题,将lapack链接到Fortran示例程序。这里是example.f95从英特尔MKL链接LAPACK与gfortran
Program LinearEquations
! solving the matrix equation A*x=b using LAPACK
Implicit none
! declarations
double precision :: A(3,3), b(3)
integer :: i, pivot(3), ok
! matrix A
A(1,:)=(/3, 1, 3/)
A(2,:)=(/1, 5, 9/)
A(3,:)=(/2, 6, 5/)
! vector b
b(:)=(/-1, 3, -3/)
!b(:)=(/2, 2, 9/)
! find the solution using the LAPACK routine DGESV
call DGESV(3, 1, A, 3, pivot, b, 3, ok)
! print the solution x
do i=1, 3
write(*,9) i, b(i)
end do
9 format('x[', i1, ']= ', f5.2)
end program LinearEquations
这里我已经安装了库
/opt/intel/compilers_and_libraries_2017.4.196/linux/mkl/lib/intel64_lin/libmkl_lapack95_ilp64.a
我使用gfortran编译程序的程序:
gfortran -o example example.f95 -L/opt/intel/compilers_and_libraries_2017.4.196/linux/mkl/lib/intel64_lin/libmkl_lapack95_ilp64.a
它抱怨
/tmp/ccWtxMFP.o: In function `MAIN__':
example.f95:(.text+0xf0): undefined reference to `dgesv_'
collect2: error: ld returned 1 exit status
有人可以帮我解决这个问题吗?非常感谢
有两种类型的链接:
-
静态链接:您与静态库链接程序。
例如:
gfortran program.f90 /path-to-lib/libmy.a -o program.x
-
动态链接:你的共享库链接程序:
例如:
gfortran program.f90 -L/path-to-lib -lmy -o program.x
与libmy.so链接程序。对于静态链接
-Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_gf_lp64.a ${MKLROOT}/lib/intel64/libmkl_sequential.a ${MKLROOT}/lib/intel64/libmkl_core.a -Wl,--end-group -lpthread -lm -ldl
:
根据MKL Advisor你应该使用这个。或:
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -lpthread -lm -ldl
动态链接。
其中${MKLROOT}
是MKL的路径。
是的,现在它工作,我用错了链接。当我使用你的建议时,一切正常。非常感谢你。 – Vlada
您似乎使用默认的32位整数,同时指定需要64位整数的库。请参阅英特尔®mkl链接顾问程序小程序以获取一整套所需的库。 – tim18
我试过ia32,但它不起作用。 – Vlada
正如您发现的那样,阅读文档比通过反复试验更容易。 – tim18