SCons
は、リンカの引数、オプション、およびフラグを、必要な順序で使用する方法を教えてください。SConsのリンク行全体を指定する
具体的には、Linux上でGNU gfortranコンパイラを使用してFortranソースコードとIntel Math Kernel Libraryからプログラムを作成しようとしています。私も私の環境のために$F95ROOT
と$MKLROOT
を知っ
${F95ROOT}/lib/intel64/libmkl_lapack95_lp64.a -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
:インテルのリンク行の顧問からは、私は私のリンカコマンドに次のセグメントを追加しなければならないことを知っています。実際、私が好きなら、
gfortran -o prog file1.o file2.o ${F95ROOT}/lib/intel64/libmkl_lapack95_lp64.a -L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
私は実行ファイルprog
を生成することができます。私は聞かせしようとした場合しかし、SConsはその後、SConsは次のコマンドを実行
mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl'
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484'
env['LIBS']=[f95root+'/lib/intel64/libmkl_lapack95_lp64.a',
'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl']
env['LIBPATH']=[mklroot+'/lib/intel64']
env['LINKFLAGS'] = ['-Wl,--no-as-needed']
としてSConstruct
ファイルを書き込むことによって、同じことを実行します。
gfortran -o prog -Wl,--no-as-needed file1.o file2.o -L/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl/lib/intel64 -l/home/norio/opt/intel/mkl2017_interfaces_gfortran484/lib/intel64/libmkl_lapack95_lp64 -lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl
:
/usr/bin/ld: cannot find -l/home/norio/opt/intel/mkl2017_interfaces_gfortran484/lib/intel64/libmkl_lapack95_lp64
env['LIBS']
に指定されたスタティックライブラリf95root+'/lib/intel64/libmkl_lapack95_lp64.a'
を共有ライブラリとみなし、リンカがそのようなファイルを見つけられなかったようです共有ライブラリ。 この特定のケースでビルド用の静的ライブラリを指定する方法を知っていれば十分かもしれません。あなたが私にそのようにする方法を教えることができれば、私はまた非常に喜んでいるでしょう。 しかし、リンカのオプション、フラグ、引数の順序が重要な場合があると私は思うが、SConsを使用するときには、その順番を制御することに興味がある。水3月22日午後12時53分34秒IST 2017
上
編集は、私が代わりに、他のソースファイルと一緒にProgram()
コマンドのsource
引数にそれを追加することにより、静的ライブラリを指定することができることを見出しましたそれをenv ['LIBS']にリストします。したがって、次のようなものが実行可能ファイルをビルドできます。
mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl'
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484'
stat_lib_list=[f95root+'/lib/intel64/libmkl_lapack95_lp64.a']
env['LIBS']=['mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl']
env['LIBPATH']=[mklroot+'/lib/intel64']
env['LINKFLAGS'] = ['-Wl,--no-as-needed']
..
env.Program(target='prog', source=['file1.f90','file2.f90']+stat_lib_list)
私はまだ全体のリンカーラインの完全な制御を持つことができるかわからない、またはSConsは本当に常に成功したオプション、フラグ、および引数の順序を把握することができてとてもスマートである場合。
を、私はそれがタグ[タグ:FORTRAN]を持つ、本当に価値があると思いますが。私がやったようにlinuxの代わりに、あるいはgfortranのように他のものを使うかどうかを決める。 Sconsは個々のコンパイラを気にしません。 –
O.K.ありがとうございました。それはいいです。私はfortranとgfortranタグのどちらを入れるべきか疑問に思いました。両方を持っていると良いです。 – norio
問題のライブラリの場所にLIBPATHを使用してみませんか? (libmkl_lapack95_lp64.a) – bdbaddog