2010-12-06 60 views
3

j'ai essayé de compiler le code Fortran suivant, aux http://techlogbook.wordpress.com/200...-kubuntu-8-04/Undefined Référence, Erreur de lien PLplot avec gfortran

program testplplot2d 
use plplot 
implicit none 
real(plflt),dimension(6) :: x,y 
real(plflt)::xmin,xmax,ymin,ymax 
x=(/1,2,3,4,5,6/) 
y=x**2 
write(*,*) y 
call plinit() 
xmin=1.0 
xmax=6.0 
ymin=1.0 
ymax=40.0 
call plcol0(1) 
call plenv(xmin,xmax,ymin,ymax,0,0) 
call pllab('X','Y','Test 1D plot') 
call plpoin(x,y,9) 
call plline(x,y) 
y=x**3 
call plpoin(x,y,9) 
call plline(x,y) 
call plend() 

end program testplplot2d 

je la commande suivante dans ma tentative de compiler le programme:

gfortran -I/usr/lib/fortran/modules/plplot testplot2d.f90 -o testplot2d

Cependant, j'ai reçu le message d'erreur de liaison détaillé ci-dessous:

/tmp/cckSqEg4.o: In function `MAIN__': 
testplot2d.f90:(.text+0x10c): undefined reference to `plinit_' 
testplot2d.f90:(.text+0x154): undefined reference to `plcol0_' 
testplot2d.f90:(.text+0x181): undefined reference to `plenv_' 
testplot2d.f90:(.text+0x1a6): undefined reference to `__plplotp_MOD_pllab' 
testplot2d.f90:(.text+0x248): undefined reference to `__plplot_MOD_plpoin' 
testplot2d.f90:(.text+0x2e5): undefined reference to `__plplot_MOD_plline' 
testplot2d.f90:(.text+0x3c6): undefined reference to `__plplot_MOD_plpoin' 
testplot2d.f90:(.text+0x463): undefined reference to `__plplot_MOD_plline' 
testplot2d.f90:(.text+0x46d): undefined reference to `plend_' 
collect2: ld returned 1 exit status

Que faire pour corriger ce problème? (J'ai lu les pages man pour gfortran, et je crois que j'utilise l'option correcte pour la liaison avec une bibliothèque.)

+0

Votre lien vers la source est cassé –

Répondre

1

J'ai également posté cela sur les forums. L'utilisateur gmargo posted la solution suivante:

Installer le paquet libplplot-dev, puis compilez avec cette ligne de commande:

gfortran testplot2d.f90 -o testplot2d $(pkg-config --cflags --libs plplotd-f95)

Merci @belisarius et @ High-Performance-Mark pour vos efforts.

0

Vous avez des références externes manquantes.

The page from where you got the code commence:

J'ai installé libplplot du gestionnaire de paquets Kubuntu Adept, et a choisi paquet « libplplot-fortran9".

Je suppose que vous devriez faire la même chose.

+0

Merci d'avoir signalé l'évidence, mais j'avais déjà installé la bibliothèque. – rmtatum

+1

@rmtatum La prochaine fois, essayez de fournir toutes les informations pertinentes. Donc, vous n'obtiendrez pas de suggestions _obvious_ –

+0

Je suppose que je devrais dire que j'avais installé gfortran aussi bien? – rmtatum

2

Les messages d'erreur que vous nous montrez sont générés par l'éditeur de liens et non par le compilateur. Je ne connais pas gfortran donc ce qui suit peut être large

-J'ai généralement (sur les compilateurs Linux et Unix que je connais) un répertoire qui contient des fichiers à inclure dans la compilation, plutôt que lors de la liaison . Pour Fortran, les fichiers .mod créés lors de la compilation d'un module doivent être inclus lors de la compilation.

Puisque vous n'obtenez pas de messages d'erreur vous indiquant que le module USE est introuvable, vous pouvez travailler sur la base de l'emplacement où vous demandez au compilateur de regarder.

Les compilateurs Linux que je connais utilisent l'indicateur -L, un répertoire et une forme abrégée du nom de la bibliothèque pour identifier les bibliothèques à lier. Dans votre cas, je m'attendais à voir quelque chose comme:

-L/path/to/installed/lib/files -lplplot 

inclus dans votre déclaration de compilation. Comment dire à gfortran d'inclure la bibliothèque au moment de la liaison? Je ne sais pas, mais je ne vois rien dans votre déclaration de compilation qui dise à gfortran quelles bibliothèques lier.

+0

Selon les pages de manuel, cela devrait fonctionner:

 -Idir These affect interpretation of the "INCLUDE" directive (as well as of the "#include" directive of the cpp preprocessor). Also note that the general behavior of -I and "INCLUDE" is pretty much the same as of -I with "#include" in the cpp preprocessor, with regard to looking for header.gcc files and other such things. This path is also used to search for .mod files when previously compiled modules are required by a "USE" statement. 
rmtatum

+0

@rmtatum: peut-être que cela devrait fonctionner, mais ce n'est pas le cas. J'ai maintenant lu une partie de la page de manuel pour gcc et je ne crois pas que vous fournissiez l'instruction de lien correcte dans votre commande de compilation. Si vous avez seulement lu les pages man de gfortran, vous avez manqué une grande partie de l'histoire - ils ne documentent que ce que gfortran fournit au-delà du reste de gcc. Continue de lire. –

+0

En utilisant la commande que vous avez suggérée (que j'ai essayée avant de lire votre publication), l'erreur suivante est produite: /usr/bin/ld: impossible de trouver -plplot collect2: ld a renvoyé 1 statut de sortie – rmtatum