2012-04-11 12 views
5

Próbuję zrozumieć, jak dynamicznie tworzyć i łączyć bibliotekę współdzieloną w Fortranie pod Linuksem.Udostępniona biblioteka w Fortranie, minimalny przykład nie działa.

Mam dwa pliki: Pierwszy, liblol.f90, wygląda następująco:

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

skompilować go z gfortran -shared -fPIC -o liblol.so liblol.f90

drugiego pliku, main.f90, wygląda następująco:

program main 
    call func() 
end program main 

Kiedy teraz spróbuję skompilować to za pomocą polecenia gfortran -L. -llol main.f90 -o main, pojawia się następujący błąd:

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

ja nie rozumiem, dlaczego to mówi „niezdefiniowana odniesienia”, ponieważ wyjście nm -D liblol.so daje mi to:

    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_ 

Czy istnieje jakiś inny parametr potrzebny?

Odpowiedz

8

Jedyną rzeczą, która ma być zmieniona jest kolejność argumentów, tak jak w

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

Tak, tylko main.f90 i -llol są odwrócone. Mam nadzieję, że to uratuje kogoś w roku jego życia, właśnie to straciłem. Na podobny temat, jeśli próbujesz skompilować program, który używa LAPACK lub BLAS (który nie działał dla mnie i dlaczego przede wszystkim próbowałem utworzyć bibliotekę współdzieloną), to samo dotyczy. Wpisz nazwę pliku źródłowego pierwszy:

gfortran mylapack.f90 -llapack -lblas -o mylapack 

Powodem tego można znaleźć w podręczniku stronach zobaczyć szczyt http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html dla opcji -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.