# [g77] Il compilatore g77 non linka le librerie [risolto]

## Cazzantonio

Uso come compilatore il g77 incluso in gcc-3.4.6-r2, tuttavia ho dei problemi a linkare delle librerie esterne al programma. Il seguente comando:

```
g77 -L/usr/lib -lfftw3 -I/usr/include -Isubroutines/ -Wall -Wsurprising -Wimplicit -Wno-globals -fno-f2c -fno-ugly -finit-local-zero -O2 -ffloat-store -march=i686 -pipe -fomit-frame-pointer programs/main.F -o lyvect
```

produce il seguente errore:

```
/tmp/cc5inS8x.o: In function `forfttw_':

ccoMzwy4.f:(.text+0x990f): undefined reference to `dfftw_plan_dft_r2c_1d__'

ccoMzwy4.f:(.text+0x991a): undefined reference to `dfftw_execute__'

collect2: ld returned 1 exit status
```

in pratica non mi trova le subroutine incluse nella libreria fftw3 che avevo linkato con il comando precedente.

Se invece del g77 uso il gfortran incluso in gcc-4.1.2 le librerie vengono linkate correttamente. Un problema del g77 direte voi? Beh ma su ubuntu il g77 (versione 3.4.6) funziona correttamente e il programma gira che è una meraviglia (stessa versione di librerie fftw).

Visto che vorrei continuare ad usare il g77 per motivi prestazionali, e che non vorrei migrare ad ubuntu, come posso risolvere questo inconveniente?

Switchare il profilo con gcc-config non cambia niente...

----------

## randomaze

 *Cazzantonio wrote:*   

> in pratica non mi trova le subroutine incluse nella libreria fftw3 che avevo linkato con il comando precedente.

 

Che sia un problema di formato e/o compilazione della libreria? Non hai nessun messaggio/warning relativo a quella?

----------

## djinnZ

ma sei sicuro che fftw sia in /usr/lib?

Anche se mi pare, a naso, il solito problema dei percorsi sballati che affligge da sempre il gcc 3.4.6 (in pratica alcuni pathname sono impostati come /var/tmp/portage/sys-deve/gcc-3.4.6/vattelappesca).

----------

## TwoMinds

...banalita': compilato fftw con la USE=fortran?...

----------

## Cazzantonio

Scusate il ritardo nella reazione ma sono tornato a lavoro oggi.

@randomaze

Purtroppo quello è il solo errore che riesco ad ottenere, penso sia un problema di PATH male impostati... solo che non so dove impostarli.

@djinnZ

Si ne sono sicuro. Proverò a guardare nei path di gcc...

@TwoMinds

Ovviamente si  :Smile: 

Per ora la soluzione tampone è di montare in chroot una partizione ubuntu e compilare lì dentro... solo che è un po' scomodo...

----------

## djinnZ

ehm... ho dimenticato di specificare che il problema riguarda i pathname inclusi nei file di libreria ed in particolare nei file .la (da cui l'eterno errore di revdep-rebuild e gcj)

----------

## Cazzantonio

Non capisco bene cosa dovrei cambiare in /usr/lib/libfftw3.la:

```
# The name that we can dlopen(3).

dlname='libfftw3.so.3'

# Names of this library.

library_names='libfftw3.so.3.1.2 libfftw3.so.3 libfftw3.so'

# The name of the static archive.

old_library='libfftw3.a'

# Libraries that this one depends upon.

dependency_libs=' -lm'

# Version information for libfftw3.

current=4

age=1

revision=2

# Is this an already installed library?

installed=yes

# Should we warn about portability when linking against -modules?

shouldnotlink=no

# Files to dlopen/dlpreopen

dlopen=''

dlpreopen=''

# Directory that this library needs to be installed in:

libdir='/usr/lib'
```

  :Question: 

Il problema è in qualche libreria del gcc? In quale? Come faccio a capirlo?

Scusate la mia ignoranza in materia...   :Embarassed: 

----------

## djinnZ

Quello che hai postato va bene gli altri non so. Per capirci potevi trovarti libdir impostat come /var/tmp/portage/vattelappesca/fftw-nonsoche/vattelappesca/usr/lib invece di /usr/lib non so se è questo il problema ma è possibile.

----------

## Cazzantonio

Forse sto arrivando a qualcosa...

Quando compilo il programma con il gfortran (gcc-4.1.2) queste sono le librerie linkate

```
ale@heavensdoor ~/Dati/Fisica/Lyvect/lyvect_1.0 $ ldd lyvect_8-6 

        linux-gate.so.1 =>  (0xb7f07000)

        libfftw3_threads.so.3 => /usr/lib/libfftw3_threads.so.3 (0xb7ef0000)

        libfftw3.so.3 => /usr/lib/libfftw3.so.3 (0xb7e03000)

        libgfortran.so.1 => /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgfortran.so.1 (0xb7d88000)

        libm.so.6 => /lib/libm.so.6 (0xb7d5f000)

        libpthread.so.0 => /lib/libpthread.so.0 (0xb7d47000)

        libgcc_s.so.1 => /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1 (0xb7d3b000)

        libc.so.6 => /lib/libc.so.6 (0xb7be8000)

        /lib/ld-linux.so.2 (0xb7f08000)
```

Mentre con il g77 (gcc-3.4.6) le librerie sono queste:

```
ale@heavensdoor /mnt/ubuntu/home/ale/lyvect_1.0 $ ldd lyvect_8-6 

   linux-gate.so.1 =>  (0xb7fc6000)

   libfftw3_threads.so.3 => /usr/lib/libfftw3_threads.so.3 (0xb7faf000)

   libfftw3.so.3 => /usr/lib/libfftw3.so.3 (0xb7ec2000)

   libg2c.so.0 => /usr/lib/gcc/i686-pc-linux-gnu/3.4.6/libg2c.so.0 (0xb7e9d000)

   libm.so.6 => /lib/libm.so.6 (0xb7e74000)

   libpthread.so.0 => /lib/libpthread.so.0 (0xb7e5c000)

   libgcc_s.so.1 => /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1 (0xb7e50000)

   libc.so.6 => /lib/libc.so.6 (0xb7cfd000)

   /lib/ld-linux.so.2 (0xb7fc7000)
```

La libreria libgcc_s.so.1 utilizzata è quella del gcc 4.1.2, invece che del 3.4.6... può essere questo il problema? Come posso istruire il compilatore ad utilizzare /usr/lib/gcc/i686-pc-linux-gnu/3.4.6/libgcc_s.so.1 ?

In ubuntu le librerie linkate sono le seguenti:

```
   linux-gate.so.1 =>  (0xb7f36000)

   libfftw3_threads.so.3 => /usr/lib/libfftw3_threads.so.3 (0xb7f1d000)

   libfftw3.so.3 => /usr/lib/libfftw3.so.3 (0xb7e37000)

   libg2c.so.0 => /usr/lib/libg2c.so.0 (0xb7e0f000)

   libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7dea000)

   libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7dd2000)

   libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7dc7000)

   libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7c78000)

   /lib/ld-linux.so.2 (0xb7f37000)
```

Ovvero riporta pathname diversi per libg2c.so.0, libgcc_s.so.1 e libc.so.6

----------

## TwoMinds

...ciao... non ho capito perfettamente il problema ma mi sembra di poter dire che sia il seguente: hai tutto il sistema compilato con gcc4 mentre vuoi usare gcc34... le fftw sono compilate con gcc4... con gfortran non esiste piu' la libg2c, sostituita da libgfortran (e non solo)... quindi: o usi gfortran invece di g77 e lasci tutto cosi'... o ti installi su un tuo path privato nella tua home fttw compilate usando gcc34 (g77) e poi linki a questa, dovrebbe bastare...

...non ho capito perche' poi devi usare g77 a tutti i costi...

OT: cosa fai di bello che hai un programma in fortran in un path che comprende la parola "Fisica"?

----------

## Cazzantonio

 *TwoMinds wrote:*   

> o ti installi su un tuo path privato nella tua home fttw compilate usando gcc34 (g77) e poi linki a questa, dovrebbe bastare...

 Grazie del consiglio! Proverò sicuramente.

 *Quote:*   

> ...non ho capito perche' poi devi usare g77 a tutti i costi...

 Perché è moolto più veloce... e nel mio caso la velocità e una componente di assoluta importanza!  :Smile: 

 *Quote:*   

> FOT: cosa fai di bello che hai un programma in fortran in un path che comprende la parola "Fisica"?

 Mi hai scoperto...   :Laughing:  Faccio simulazioni numeriche, e uso un misto di C e Fortran(77) perché nel mio gruppo di ricerca conoscono tutti soltanto il fortran...  :Mad: 

Siccome molte di queste simulazioni durano tempi geologici (anche un mese su un quad-xeon 3ghz) capisci bene che anche un 10% in più di velocità mi cambia parecchio la vita... e il g77, per il fatto che è più vecchio, è molto più veloce del suo corrispettivo del gcc-4.1.2.

Vorrei passare tutto il codice verso il fortran95, ma purtroppo questo tipo di considerazioni me lo impedisce.

----------

## Cazzantonio

Ho risolto compilando le librerie fftw in locale con la stessa versione di gcc utilizzata per il programma originario (gcc-3.4.6). Grazie a TwoMinds per avermi fatto notare la semplice soluzione  :Smile: 

----------

