2012-04-11 10 views
5

LinuxでFortranで共有ライブラリを動的に作成してリンクする方法を理解しようとしています。Fortranでの共有ライブラリ、最小限の例が機能しない

私は2つのファイルを持っている:最初の1、liblol.f90は、次のようになります。私はgfortran -shared -fPIC -o liblol.so liblol.f90

秒ファイル、main.f90でコンパイル

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

、次のようになります。

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 

、オプション-lためhttp://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlの上部を参照してください:

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.

ソースファイルの名前最初を書きます
関連する問題