2012-04-11 15 views
5

Estoy tratando de comprender cómo crear dinámicamente y vincular una biblioteca compartida en Fortran en Linux.Biblioteca compartida en Fortran, el ejemplo mínimo no funciona

Tengo dos archivos: el primero, liblol.f90, se ve así:

subroutine func() 
    print*, 'lol!' 
end subroutine func 

compilo con gfortran -shared -fPIC -o liblol.so liblol.f90

El segundo archivo, main.f90, se parece a esto:

program main 
    call func() 
end program main 

Cuando intento compilarlo con el comando gfortran -L. -llol main.f90 -o main, aparece el siguiente error:

/tmp/ccIUIhcE.o: In function `MAIN__': 
main.f90:(.text+0xa): undefined reference to `func_' 
collect2: ld returned 1 exit status 

No entiendo por qué se dice "referencia indefinida", ya que la salida de nm -D liblol.so me da esto:

    w _Jv_RegisterClasses 
0000000000201028 A __bss_start 
       w __cxa_finalize 
       w __gmon_start__ 
0000000000201028 A _edata 
0000000000201038 A _end 
0000000000000778 T _fini 
       U _gfortran_st_write 
       U _gfortran_st_write_done 
       U _gfortran_transfer_character_write 
0000000000000598 T _init 
00000000000006cc T func_ 

¿Hay algún otro parámetro necesario?

Respuesta

8

Lo único que tiene que cambiar es el orden de los argumentos, como en

gfortran -L. main.f90 -llol -o main 

Si, sólo main.f90 y -llol están invertidos. Espero que esto le salve a alguien el año de su vida que acabo de perder en esto. En una nota relacionada, si está intentando compilar un programa que usa LAPACK o BLAS (que no funcionó para mí y es por eso que, en primer lugar, traté de crear una biblioteca compartida), también se aplica lo mismo. Escribir el nombre del archivo fuente primera:

gfortran mylapack.f90 -llapack -lblas -o mylapack 

La razón de esto se puede encontrar en las páginas del manual, ver la parte superior de http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html para la opción -l:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded.

Cuestiones relacionadas