Я пытаюсь установить некоторые модули Python в своей системе, используя f2py, которые связаны с моделью океана (в Fortran 90). Я столкнулся с некоторыми проблемами с f2py. Чтобы быть конкретным, f2py не может связываться с библиотекой NetCDF, даже если у меня есть необходимая библиотека и файлы с включенными файлами. Я использую Python 2.7 с Anaconda 2 на Ubuntu16.04 на 64-битной машине. Я использую gfortran.f2py не может связываться с библиотекой NetCDF -
Чтобы проверить работу, я написал небольшой код - модуль 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
Makefile для TestSub является:
#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 и включают в себя файлы, установленные в заданных путях. Когда я бегу Makefile, используя make pytest
, я получаю следующее сообщение об ошибке:
/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. Какая здесь ошибка? Это из-за структуры кода? Или мне нужно включить какую-то другую библиотеку?
Предпочитайте общий тег поверх тегов версии, чтобы привлечь зрителей. Используйте [tag: fortran] и [tag: python]. В противном случае люди не увидят ваш вопрос. –
И BTW Fortran 90 очень старый, и большинство программ - Fortran 95 или даже 2003, возможно, даже ваша модель океана. –