2012-04-11 22 views
5

Linux altında Fortran'da paylaşılan bir kitaplığın dinamik olarak nasıl oluşturulacağını ve bağlanacağını anlamaya çalışıyorum.Fortran'daki paylaşılan kitaplık, minimal örnek çalışmıyor

İki dosya var: Birincisi, liblol.f90, şöyle görünür: Ben gfortran -shared -fPIC -o liblol.so liblol.f90

İkinci dosya, main.f90 ile derlemek

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

, şuna benzer:

program main 
    call func() 
end program main 

Şimdi bunu gfortran -L. -llol main.f90 -o main komutuyla derlemeye çalıştığımda, şu hatayı alıyorum:

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

nm -D liblol.so çıktısı bana bu verir çünkü "tanımsız başvuru" diyor niye anlamıyorum:

    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_ 

başka parametre gerekli var mı?

cevap

8

değiştirilmelidir tek şey

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

Evet, sadece main.f90 olduğu gibi argümanlar sırasıdır ve -llol tersine çevrilir. Umarım bu, hayatım boyunca kaybettiğim birini kurtarır. İlgili bir notta, LAPACK veya BLAS kullanan bir program derlemeye çalışıyorsanız (benim için işe yaramadı ve ilk etapta kendimi paylaşılan bir kitaplık oluşturmaya çalıştım), aynısı geçerlidir.

Bunun nedeni manuel sayfalarında bulunabilir
gfortran mylapack.f90 -llapack -lblas -o mylapack 

, opsiyon -l için http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html üst bakın:

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.

kaynak dosyasının adını ilk yazın
İlgili konular