2016-12-26 6 views
0

Я пытаюсь установить некоторые модули 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. Какая здесь ошибка? Это из-за структуры кода? Или мне нужно включить какую-то другую библиотеку?

+0

Предпочитайте общий тег поверх тегов версии, чтобы привлечь зрителей. Используйте [tag: fortran] и [tag: python]. В противном случае люди не увидят ваш вопрос. –

+0

И BTW Fortran 90 очень старый, и большинство программ - Fortran 95 или даже 2003, возможно, даже ваша модель океана. –

ответ

1

Вы компилируете общую (динамическую) библиотеку, и вы должны использовать версию NetCDF с общей библиотекой.

Если вы установили NetCDF самостоятельно (как предложено путем в вашем /home/sonaljit), вы должны установить версию .so и ссылку с этой версией.

+0

Спасибо за ответ. У меня была установлена ​​общая версия .so для libnetcdff. Я включил эту библиотеку в make-файл, и это сработало. Большое спасибо за ответ, Владимир. –

+0

да, ответ действительно помощь. Я использовал статическую библиотеку .a, которая не выполняла эту работу. Решение проблемы с общей библиотекой .so позволило решить эту проблему. –