0

Je suis en train de construire un modèle Fortran avec Parallel IO (1.7.2) inclus Mais je suis arrivé de nombreuses erreurs comme celles-ci:.référence non définie à « » __netcdf_MOD_nf90_ »

pionfwrite_mod.F90:(.text+0x1bad): undefined reference to `nfmpi_iput_vara_' 
pionfwrite_mod.F90:(.text+0x21ad): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint' 
pionfwrite_mod.F90:(.text+0x22a9): undefined reference to `__netcdf_MOD_nf90_inquire_variable' 
pionfwrite_mod.F90:(.text+0x27e5): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint' 
pionfwrite_mod.F90:(.text+0x2ad7): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint' 

Je googlé et trouvé un possible solutions, par exemple, https://www.myroms.org/wiki/Frequently_Asked_Questions#Errors_at_link_time, mais je ne peux toujours pas résoudre mon problème

Questions: est-ce un problème de liaison de la bibliothèque? Si non, pourriez-vous s'il vous plaît me donner quelques suggestions sur la façon de déboguer? Si oui, pourriez-vous s'il vous plaît partager les étapes détaillées sur la façon de lier la bibliothèque? Merci

bibliothèques Environnement: PnetCDF 1.8.1, netCDF 4.5.1, Parallel IO 1.7.2, gcc 7.1.1, openmpi-2.0.2-2.fc26.x86_64

+1

Oui, c'est une erreur de liaison. Vous devez lier la bibliothèque NetCDF. Alors, comment reliez-vous? Est-ce que vous liez avec NetCDF? De quelle façon précisément? Quelle commande a provoqué l'erreur? Nous devons voir les détails. C'est la même chose qu'avec votre dernière question. Comment pouvons-nous dire ce qui ne va pas quand vous ne nous dites pas ce que vous faites? –

+0

Veuillez utiliser le tag [tag: fortran] pour toutes les questions Fortran. Fortran 90 est juste une ancienne version. Si vous êtes un étudiant, il pourrait même être plus âgé que vous. –

+0

Assurez-vous que toutes les bibliothèques que vous souhaitez lier précèdent d'autres bibliothèques du même nom dans votre chemin de liaison, par exemple, afin que la bibliothèque fortran netCDF compilée avec les options parallèles précède la bibliothèque fortran netCDF compilée sans options parallèles. La variable LD_LIBRARY_PATH est souvent cruciale. –

Répondre

0

Je résolu mon problème en cochant la chemin de la bibliothèque et installer les versions antérieures de netcdf et pnetcdf dans les dossiers locaux.

Le makefile de ce modèle MPAS définit le chemin d'netcdf et de la bibliothèque comme suit:

ifneq "$(NETCDF)" "" 
     CPPINCLUDES += -I$(NETCDF)/include 
     FCINCLUDES += -I$(NETCDF)/include 
     LIBS += -L$(NETCDF)/lib 
     NCLIB = -lnetcdf 
     NCLIBF = -lnetcdff 
     ... 
endif 

alors que pour F26 linux, il semble que le netcdf installé à l'aide DNF (pas sûr si DNF est la raison même) ne construit pas un dossier séparé pour mettre tous les fichiers connexes en $ NETCDF, les fichiers associés sont plutôt installés sous/usr/local/include et/usr/lib64

$ which netcdf 
/usr/local/include/netcdf 

$ which libnetcdf.so.11 
/usr/lib64/libnetcdf.so.11 

qui conduit à l'erreur dans la construction du modèle.

J'essayais de modifier le fichier makefile mais cela a conduit à de nombreuses autres erreurs. J'ai donc gardé le fichier makefile inchangé, et construit netcdf séparé et pnetcdf à partir de sources dans des dossiers locaux distincts, et d'utiliser les chemins correspondants pour reconstruire PIO et pour compiler le modèle, ce qui a résolu mon problème. Notez que ces chemins pnetcdf et netcdf doivent également être ajoutés dans ~/.bashrc en tant que LD_LIBRARY_PATH pour l'exécution du modèle MPAS. Plus d'instructions peuvent être trouvées ici: http://www2.mmm.ucar.edu/projects/mpas/tutorial/UK2015/index.html.