f2py无法与NetCDF库链接
我尝试在我的系统中使用f2py安装一些Python模块,这些模块与海洋模型(在Fortran 90中)相关。 我正面临f2py的一些问题。 具体而言,即使我安装了所需的库和包含文件,f2py也无法与NetCDF库链接。 我在64位机器上的Ubuntu16.04上使用Python 2.7与Anaconda 2。 我正在使用gfortran。
为了测试它的工作,我写了一个小代码 - 一个包含一个小子程序的f90模块。 该子程序执行基本的数学任务,并调用一个NetCDF例程来打印安装的NetCDF版本。 模块(testsub.f90)如下所示:
module testsub
implicit none
contains
subroutine f_sum(a, b, s)
!#include 'netcdf.inc'
use netcdf
real(8) :: a, b, s
s = a+b;
!Calls a function that prints the netcdf version
write(*,*) trim(nf90_inq_libvers())
end subroutine f_sum
end module
testsub的makefile文件是:
#Fortran compiler
FC=gfortran
NCLIB = -L/home/sonaljit/anaconda2/lib -lnetcdf -lnetcdff -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7
NCINC = -I/home/sonaljit/anaconda2/include
#f2py and flags
F2PY = /home/sonaljit/anaconda2/bin/f2py
PYFLAGS = "-fPIC -g -O2 -fdefault-real-8"
pytest : testsub.f90
$(F2PY) --fcompiler=$(FC) --f90flags=$(PYFLAGS) -c $(NCINC) -m testpymod testsub.f90 $(NCLIB)
clean :
rm testpymod.so
我有NetCDF库和包含在给定路径中安装的文件。 当我使用make pytest
运行makefile时,出现以下错误:
/usr/bin/ld: /home/sonaljit/anaconda2/lib/libnetcdf.a(netcdf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/home/sonaljit/anaconda2/lib/libnetcdf.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
但是,当我注释掉模块中的NetCDF行时,我没有看到这个错误。 看来f2py无法链接到NetCDF例程。 这里可能是什么错误? 这是由于代码的结构吗? 或者,我是否需要包含其他一些库?
您正在编译共享(动态)库,您应该使用共享库版本的NetCDF。
如果您自己安装NetCDF(如您的/home/sonaljit
的路径/home/sonaljit
),则应安装.so版本并链接到此版本。
上一篇: f2py is not able to link with NetCDF library
下一篇: Issue creating f2py shared object file when linking to libraries and modules