ubuntuusers.de

gfortran + plplot: Fehler beim Compilieren

Status: Gelöst | Ubuntu-Version: Ubuntu 6.10 (Edgy Eft)
Antworten |

Sandwich

Anmeldungsdatum:
9. April 2007

Beiträge: 153

Hallo Leute!

Habe mit aptitude gfortran (universe) und libplplot-fortran9 (universe) installiert.

In einem program.f90 kommen unter anderem die Zeile

call plinit ()

und andere Aufrufe von plplot-Routinen vor.

Beim Kompilieren des Programms mit gfortran program.f90 erhalte ich die Fehlermeldung:

program.f90:(.text+0x193): undefined reference to plinit_'

sowie analoge zu allen anderen verwendeten PLPlot-Routinen.

Was muss ich tun, damit das Programm fehlerfrei kompiliert und ich in dem Fortran90-Programm PLPlot-Routinen aufrufen kann?

1) Optionen bei gfortran program.f90 angeben? (welche?)
2) Irgendwelche PLPlot-Module ins F90-Programm einbinden (mit USE)?
3) ...?

Im Wiki habe ich nichts dazu gefunden.

Mit Installation von Programmen, Bearbeiten von Paketquellen, Ein einzelnes Paket installieren und Ein Terminal öffnen bin ich vertraut.

Ansonsten bin ich ein Neuling hier und hoffe, die Ubuntu-Forums-Etikette eingehalten zu haben.

Danke!

Johannes

buur

Avatar von buur

Anmeldungsdatum:
22. Oktober 2005

Beiträge: 148

Wohnort: Aachen

Wie compilierst du denn das Program? Hab jetzt selber nicht so die Ahnung von der bib aber ich denke schon das du sie
1. mit USE einbinden must und
2. beim compilieren das Program und die Bibliothek verlinken musst. Etwa so gfortran -0 program.f90 -I/usr/include/plplot

Aber poste doch mal die compilieranweißung

haraldkl

Avatar von haraldkl

Anmeldungsdatum:
21. Juli 2005

Beiträge: 1903

Wohnort: Würselen

Hi,
du musst das Modul in deinem Programm mit use bekannt machen, siehe auch: plplot/bindings/f95/readme_f95.txt.
Neben der Library, die du zu deinem Programm hinzulinken musst, wie buur bereits sagt, musst du auch noch den Pfad zu dem Modul bekannt machen, damit der Compiler das .mod findet.
Das funktioniert mit dem großen i. Die Library wird mit einem kleinen L angegeben und der Pfad mit einem großen:

-I /usr/lib/fortran/modules/plplot -L/usr/lib -lplplotf95d -lplplotf95cd -lplplotd


Die Pfadangabe müsstest du auch weglassen können, da er /usr/lib sowieso durchsuchen sollte. Bei den Libraries weiß ich leider nicht genau welche du alle brauchst, habs nicht ausprobiert 😉

Sandwich

(Themenstarter)

Anmeldungsdatum:
9. April 2007

Beiträge: 153

Hallo!

Danke! Aber leider funktioniert's noch nicht.

Ich habe plpot mit use ins Fortran-Programm plplot_test.f90 eingebunden:

program plplot_test
use plplot
implicit none
...
call plinit ()
...
call plend ()
...
end program plplot_test


und compiliere mit

gfortran -I/usr/lib/fortran/modules/plplot -L/usr/lib -lplplotf95d -lplplotf95cd -lplplotd plplot_test.f90

Dabei erhalte ich die Fehlermeldung

/usr/bin/ld: cannot find -lplplotf95d
collect2: ld returned 1 exit status

Wenn ich beim gfortran-Aufruf das -lplplotf95d weglasse, kriege ich eine analoge Fehlermeldung zu plplotf95cd, und weiter analog zu plplotd.

Wenn ich alle drei l(ib)s weglasse, kommt

/tmp/ccxudHKn.o: In function MAIN\__':\\ plplot_test.f90:(.text+0x193): undefined reference to plinit_'
plplot_test.f90:(.text+0x1c7): undefined reference to \__plplotp\__pllab'\\ plplot_test.f90:(.text+0x1cc): undefined reference to plend_'
collect2: ld returned 1 exit status

Ein

ls -al /usr/lib/libplplot*

liefert

lrwxrwxrwx 1 root root     19 2007-04-06 17:22 /usr/lib/libplplotd.so.9 -> libplplotd.so.9.2.0
-rw-r--r-- 1 root root 247236 2006-09-19 21:29 /usr/lib/libplplotd.so.9.2.0
lrwxrwxrwx 1 root root     23 2007-04-06 17:22 /usr/lib/libplplotf77cd.so.9 -> libplplotf77cd.so.9.1.0
-rw-r--r-- 1 root root  32168 2006-09-19 21:29 /usr/lib/libplplotf77cd.so.9.1.0
lrwxrwxrwx 1 root root     22 2007-04-06 17:22 /usr/lib/libplplotf77d.so.9 -> libplplotf77d.so.9.1.0
-rw-r--r-- 1 root root  13956 2006-09-19 21:29 /usr/lib/libplplotf77d.so.9.1.0
lrwxrwxrwx 1 root root     23 2007-04-06 17:22 /usr/lib/libplplotf95cd.so.0 -> libplplotf95cd.so.0.0.0
-rw-r--r-- 1 root root  32552 2006-09-19 21:29 /usr/lib/libplplotf95cd.so.0.0.0
lrwxrwxrwx 1 root root     22 2007-04-06 17:22 /usr/lib/libplplotf95d.so.0 -> libplplotf95d.so.0.0.0


Was nun?

Danke!

haraldkl

Avatar von haraldkl

Anmeldungsdatum:
21. Juli 2005

Beiträge: 1903

Wohnort: Würselen

Hast du libplplot-dev installiert?

Sandwich

(Themenstarter)

Anmeldungsdatum:
9. April 2007

Beiträge: 153

Jetzt schon 😉 . Danke für den Tipp!

Beim Compilieren mit

gfortran -I/usr/lib/fortran/modules/plplot -L/usr/lib -l plplotf95d -l plplotf95cd -l plplotd plplot_test.f90

(genauso mit zusätzlich -l plplotcxxd -l plplotgnome2d) ergibt sich nun folgende Fehlermeldung:

 In file plplot_test.f90:19

call plenv (0.1, 1.0, 0.0, 1.0, 0, 0);
           1
Error: Type/rank mismatch in argument 'xmin' at (1)
 In file plplot_test.f90:21

call plpoin (ns, xs, ys, 9) ! symbol 9; plsym
                                            1
Error: There is no specific subroutine for the generic 'plpoin' at (1)


Das Programm enthält u.a.:

call plinit ()
call plenv (0.1, 1.0, 0.0, 1.0, 0, 0);
call pllab ("xlbl", "ylbl", "plot-label")
call plpoin (ns, xs, ys, 9) ! symbol 9; plsym
call plend () ! to close the plot.


Ein

sudo find / -name "*plplot*"

ergibt: http://www.ubuntuusers.de/paste/9564/

Was jetzt?
Danke!

haraldkl

Avatar von haraldkl

Anmeldungsdatum:
21. Juli 2005

Beiträge: 1903

Wohnort: Würselen

Hi,
ich kam jetzt mal dazu das ganze auszuprobieren. Zum linken scheint plplotf95d zu langen.
Hier mal ein Beispielprogramm, dass bei mir funktioniert:

program testpl
  use plplot
  implicit none

  integer :: i
  real(kind=plflt) :: x_coords(5), y_coords(5)

  do i=1,5
   x_coords(i) = 0.1_plflt * i
   y_coords(i) = 0.1_plflt * i
  end do
  call plinit ()

  call plenv(0.1_plflt, 1.0_plflt, 0.0_plflt, 1.0_plflt, 0, 0)

  call plpoin(x_coords, y_coords, 9)

  call plend ()

end program testpl


Kompiliert hab ich das ganze mit:

gfortran -I/usr/lib/fortran/modules/plplot testplplot.f90 -lplplotf95d


Bekomme einen hübschen Graphen 😉

Zur Erklärung: Die Variablen, die man den Routinen übergibt müssen vom gleichen Typ sein, wie von den Parametern vorgegeben. PlPlot stellt hier einen KIND Typ namens plflt zur Verfügung. Konstanten müssen ebenfalls diesen Kind bekommen, was man durch das angehängte _plflt erreichen kann.
In Fortran kann die explizite Angabe der Feldgröße entfallen, da sie implizit mit übergeben wird. In der Readme wird das empfohlen. Und im Fortran95 Modul(Zeile 970) zumindest für plpoin auch nur in der Art implementiert. Leider habe ich keine andere explizite Dokumentation des f95 Bindings gefunden in der alle Routinen aufgelistet werden, als den Quelltext selbst.

Sandwich

(Themenstarter)

Anmeldungsdatum:
9. April 2007

Beiträge: 153

Ach ja, die Variablen-Typen. Danke! plint muss anscheinend nicht extra deklariert werden.

Ich rekapituliere und fasse zusammen (wenn ich's später mal wieder wo neu aufsetzen muss, und für andere):

1. Installieren der Pakete:

sudo aptitude install gfortran libplplot-fortran9 libplplot-dev

2. Im Fortran-Programm use plplot und kind=plflt verwenden:

program plplot_test
use plplot ! use
implicit none
integer              :: i
integer, parameter   :: ns = 9, nr = 101
real (kind=plflt), dimension (ns) :: xs, ys ! plflt
real (kind=plflt), dimension (nr) :: xr, yr ! plflt
forall (i = 1:nr) xr(i) = 0.1 * (i-1)
yr = xr**2 * exp(-xr)
forall (i = 1:ns)
  xs(i) = xr(10*i+1)
  ys(i) = yr(10*i+1)
end forall
call plinit ()
call plenv  (0.0_plflt, xr(nr), 0.0_plflt, maxval(yr), 0, 0) ! _plflt
call pllab  ("x", "y", "PLPLOT Graph: y = x^2.exp(-x)")
call plline (xr, yr)
call plpoin (xs, ys, 9)
call plend  ()
end program plplot_test


3. Compilation mit

gfortran -I/usr/lib/fortran/modules/plplot -l plplotf95d plplot_test.f90

Also danke nochmals!

Antworten |