9

LinuxのFortranで共有ライブラリを動的に作成してリンクする方法を理解しようとしています。

2つのファイルがあります。最初のファイルは次のliblol.f90ようになります。

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

私はそれをコンパイルしますgfortran -shared -fPIC -o liblol.so liblol.f90

2番目のファイル、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_

他に必要なパラメータはありますか?

4

1 に答える 1

16

変更する必要があるのは、引数の順序だけです。

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の上部を参照してください。

コマンドのどこにこのオプションを書くかによって違いが生じます。リンカは、指定された順序でライブラリとオブジェクトファイルを検索して処理します。したがって、ファイルfoo.oの後、bar.oの前でfoo.o -lz bar.oライブラリを検索します。zbar.oが`z'の関数を参照している場合、それらの関数はロードされない可能性があります。

于 2012-04-12T13:46:06.180 に答える