2014-07-15 2 views
0

несколько месяцев назад я задал вопрос о написании файлов netcdf3 с кодом netcdf4. Теперь у меня другая проблема. У меня более старый код fortran, который запускается в последовательном порядке и используется для интерполяции данных из одной сетки в другую. Код основан на использовании файлов netcdf3, и я хотел бы перекомпилировать его с netcdf4. код использует следующие функции netcdf: nf_open, nf_put_vara_real и т. д. Я далек от того, чтобы быть экспертом, но, насколько я читал, код должен по-прежнему принимать файлы netcdf4 с этими вызовами. Однако, когда я пытаюсь скомпилировать его с netcdf4, я получаю много сообщений об ошибках. Код сам использует netcdf.inc, который находится в той же папке, что и код, команды компиляции следующим образом:, связывающий код fortran с использованием netcdf3 на netcdf4

gfortran parameter.f90 netcdf_utils.f90 mean_streaks.f90 -L/opt/netcdf/netcdf3/lib/ -lnetcdf -O2 

Затем я попытался просто изменить netcdf3 до 4, как у меня есть netcdf3 и 4 папки под/неавтоматического/NetCDF. Тем не менее, я, например, следующие сообщения об ошибках при компиляции:

/tmp/ccgwLiTF.o: In function `__netcdf_utils_MOD_read3d': 
netcdf_utils.f90:(.text+0x445): undefined reference to `nf_open_' 
netcdf_utils.f90:(.text+0x4a0): undefined reference to `nf_get_vara_real_' 
netcdf_utils.f90:(.text+0x4b4): undefined reference to `nf_close_' 

Кто-нибудь случится, чтобы знать, что я пропускаю или как я должен связать библиотеки, чтобы получить сборник сделан?

спасибо за ответы заранее

ответ

0

Добавить -lnetcdff вашей команды компиляции (да, 2 е в). В netcdf4 символы Fortran заканчиваются этой библиотекой, а не libnetcdf.so.

gfortran parameter.f90 netcdf_utils.f90 mean_streaks.f90 -L/opt/netcdf/netcdf4/lib/ -lnetcdf -lnetcdff -O2 

Вы можете проверить, что символы в этой библиотеке с командой, как

readelf -s libnetcdff.so | grep 'nf_*_' 

выход которого, на мой установки, включает в себя все символы, перечисленные в вашей ошибки.

0

Я нашел проблему. Дело в том, что в кластере, который я использую, netcdf4 был скомпилирован с mpif90, а не gfortran. Поэтому я изменил gfortran на mpif90 и использовал измененный netcdf3 для netcdf4. Я также добавил другие ссылки, для которых я использовал CMakeList для другого кода, который использует netcdf4. Окончательный рабочий продукт:

mpif90 parameter.f90 netcdf_utils.f90 mean_streaks.f90 -I/opt/netcdf/netcdf4/include -L/opt/netcdf/netcdf4/lib -lnetcdff -L/opt/pnetcdf/pnetcdf-1.2.0/lib -L/opt/netcdf/netcdf4/hdf5.1.8.8/lib -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl -O2 

спасибо за помощь, теперь у меня есть еще один вопрос, который я буду отправлять в какое-то время :)