Ошибка: неопределенная ссылка на функции NetCDF

#linux #fortran #linker-errors #gfortran #netcdf

#linux #fortran #компоновщик -ошибки #gfortran #netcdf

Вопрос:

Предыстория

Я работаю над компиляцией MCIP, что означает процессор интерфейса метеорологической химии в системе centos 5.9.

Я использую gcc -версию 4.9 для реализации процесса.

Настройка

Вот некоторые настройки конфигурации в ~/.bashrc:

 export DIR=/disk2/hyf/lib ## All lib ar installed under this path
# NetCDF setting
export PATH="$DIR/netcdf/bin:$PATH"
export NETCDF="$DIR/netcdf"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NETCDF/lib     
# IOAPI 
export BIN=Linux2_x86_64gfort
export BASEDIR=/disk2/hyf/backup/software/ioapi
export PATH=$DIR/ioapi-3.1/bin:$PATH
export LD_LIBRARY_PATH=$DIR/ioapi-3.1/lib:$LD_LIBRARY_PATH
# Set M3LIB for the model
export M3LIB=/disk2/hyf/cmaq/CMAQv5.1/lib
  

Я также делаю программную ссылку для модели CMAQ, поскольку они:
ln -s $ NETCDF $ (M3LIB)/x86_64/gcc/netcdf
ln -s $ IOAPI $(M3LIB)/x86_64/gcc/ioapi

Makefile

Вот некоторая подпрограмма в Makefile:

  # Requirements: set M3LIB before running this script

.SUFFIXES:
.SUFFIXES: .o .f90 .F90

MODEL = mcip.exe

#...gfortran
FC      = gfortran
NETCDF = $(M3LIB)/netcdf
IOAPI_ROOT = $(M3LIB)/ioapi
FFLAGS  = -O3 -gdwarf-2 -gstrict-dwarf -I$(NETCDF)/include -   I$(IOAPI_ROOT)/include 
      -ffpe-trap='invalid','zero','overflow','underflow'
##FFLAGS        = -g -O0  
      -ffpe-trap='invalid','zero','overflow','underflow'  
      -I$(NETCDF)/include -I$(IOAPI_ROOT)/include
LIBS    = -L$(IOAPI_ROOT)/lib -lioapi  
      -L$(NETCDF)/lib -lnetcdf -lgomp

DEFS   =

MODULES =
 const_mod.o 
 const_pbl_mod.o 
 coord_mod.o 
 date_time_mod.o 
 date_pack_mod.o 
 files_mod.o 
 groutcom_mod.o 
 luvars_mod.o 
 mcipparm_mod.o 
 mcoutcom_mod.o 
 mdoutcom_mod.o 
 metinfo_mod.o 
 metvars_mod.o 
 vgrd_mod.o 
 wrf_netcdf_mod.o 
 xvars_mod.o 
 sat2mcip_mod.o

OBJS =
 mcip.o 
 alloc_ctm.o 
 alloc_met.o 
 alloc_x.o 
 bcldprc_ak.o 
 blddesc.o 
 chkwpshdr.o 
 chkwrfhdr.o 
 close_files.o 
 collapx.o 
 comheader.o 
 cori.o 
 dealloc_ctm.o 
 dealloc_met.o 
 dealloc_x.o 
 detangle_soil_px.o 
 e_aerk.o 
 dynflds.o 
 getgist.o 
 getluse.o 
 getmet.o 
 getpblht.o 
 getsdt.o 
 getversion.o 
 graceful_stop.o 
 gridout.o 
 init_io.o 
 init_met.o 
 init_x.o 
 julian.o 
 layht.o 
 ll2xy_lam.o 


 .......
  

ОШИБКА

Вывод после того, как я делаю, показывает, что:

 make[1]: Entering directory `/disk2/hyf/cmaq/CMAQv5.1/scripts/mcip/src'
gfortran -g -O0 -gdwarf-2 -gstrict-dwarf  
         -I/disk2/hyf/cmaq/CMAQv5.1/lib/x86_64/gcc/netcdf/include       
         -I/disk2/hyf/cmaq/CMAQv5.1/lib/x86_64/gcc/ioapi/include  -c const_mod.f90
......

chkwpshdr.o: In function `chkwpshdr_':
/disk2/hyf/cmaq/CMAQv5.1/scripts/mcip/src/chkwpshdr.f90:109:     
 undefined reference to `__netcdf_MOD_nf90_get_att_one_fourbyteint'

 (a lot of these code showing the same mistake 'undefined reference')  

 /disk2/hyf/cmaq/CMAQv5.1/lib/x86_64/gcc/ioapi/lib/libioapi.a(open3.o): In    
 function `open3_':
 open3.F:(.text 0x1531): undefined reference to `ncclos_'
 .........
  

Я думаю, что у компилятора могут быть некоторые конфликты с .В некоторых случаях файлы F и .f90. Но я не знаю почему. gcc and уже успешно установлен с определенным $PATH .

Комментарии:

1. Почему это помечено C вместо Fortran?

2. Извините, система веб-сайта просто рекомендовала «c » в первую очередь.

3. Это netcdf, который связан неправильно. Какая версия NetCDF у вас есть? Где он установлен?

4. Я использую netcdf-версию 4.13 (последнюю версию netcdf-c и fortran вместе). Я установил его в другом месте и ln -s $netcdf_PATH $(M3LIB)/x86_64/gcc/netcdf

5. netcdf должен быть установлен правильно. Потому что другие модели хорошо выполнили.

Ответ №1:

Я столкнулся с той же проблемой, и я должен решить ее, добавив -lnetcdff и -lnetcdf (в этом порядке) к опции LIBS в MCIP makefile . Убедитесь, что переменная NETCDF указывает правильный путь, по которому в вашей системе установлен netcdf.

Комментарии:

1. Спасибо за ваш ответ. Я проверю это позже.