2012-04-11 45 views
5

我想了解如何在Linux下動態創建並鏈接Fortran中的共享庫。Fortran中的共享庫,最小示例不起作用

我有兩個文件:第一個,liblol.f90,看起來是這樣的:

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

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

第二個文件,main.f90編譯它,看起來是這樣的:

program main 
    call func() 
end program main 

當我現在嘗試使用命令gfortran -L. -llol main.f90 -o main進行編譯時,出現以下錯誤:

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

我不明白爲什麼它說:「未定義的引用」,因爲nm -D liblol.so輸出給了我這樣的:

    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_ 

是否有其他任何需要的參數?

回答

8

必須被唯一改變的是參數的順序,如

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

是的,只有main.f90時和-llol是相反的。我希望這能拯救一個人,讓他在這一年中失去一生。在相關說明中,如果您試圖編譯使用LAPACK或BLAS的程序(這對我不起作用,並且爲什麼我首先嚐試自己創建共享庫),這同樣適用。 編寫源文件的第一名稱:

gfortran mylapack.f90 -llapack -lblas -o mylapack 

這樣做的原因可以在手冊頁中找到,看到的http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html頂部的選項-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.