2017-03-21 7 views
0

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は本当に常に成功したオプション、フラグ、および引数の順序を把握することができてとてもスマートである場合。

+0

を、私はそれがタグ[タグ:FORTRAN]を持つ、本当に価値があると思いますが。私がやったようにlinuxの代わりに、あるいはgfortranのように他のものを使うかどうかを決める。 Sconsは個々のコンパイラを気にしません。 –

+0

O.K.ありがとうございました。それはいいです。私はfortranとgfortranタグのどちらを入れるべきか疑問に思いました。両方を持っていると良いです。 – norio

+0

問題のライブラリの場所にLIBPATHを使用してみませんか? (libmkl_lapack95_lp64.a) – bdbaddog

答えて

1

これは機能しますか?

mklroot='/opt/intel/compilers_and_libraries_2017.2.174/linux/mkl' 
f95root='/home/norio/opt/intel/mkl2017_interfaces_gfortran484' 
env['LIBS']=['mkl_lapack95_lp64', 
    'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'] 
env['LIBPATH']=[mklroot+'/lib/intel64',f95root ] 
env['LINKFLAGS'] = ['-Wl,--no-as-needed'] 

.. 

env.Program(target='prog', source=['file1.f90','file2.f90']) 

さらに私は通常のでビルダーでLIBS(時にはLIBPATH)を指定:

env.Program(target='prog', source=['file1.f90','file2.f90'], 
      LIBS =['mkl_lapack95_lp64', 'mkl_gf_lp64', 'mkl_intel_thread', 'mkl_core', 'iomp5', 'pthread', 'm', 'dl'], 
      LIBPATH=[mklroot+'/lib/intel64',f95root ]) 
+0

あなたの答えをありがとう。あなたのメソッドは、 'env ['LIBPATH'] = [f95root + '/ lib/intel64'、mklroot + '/ lib/intel64']'としてLIBPATHの指定を変更することによって機能しました(ビルダーでLIBSとLIBPATHを指定しません)。 'env ['LIBPATH']'リストの要素の順序は、コマンドラインで '-L'オプションのようにこの順序で現れ、' libmkl_intel_thread.a'という名前のファイルがありますが(しかし、異なる内容)の両方を含む。 'f95root + '/ lib/intel64'の下のものにリンクする必要があります。だから、まずそれを置く必要があった。 – norio

+0

素晴らしい!上記の解決策がある場合は、回答としてマークしてください。 – bdbaddog

関連する問題