为SCons指定整个链接行

时间:2017-03-21 21:55:09

标签: linker fortran gfortran scons intel-mkl

如何让SCons按我想要的顺序使用链接器参数,选项和标志?

更具体地说,我正在尝试使用Linux上的GNU gfortran编译器从Fortran源代码和Intel Math Kernel Library构建程序。从英特尔的链接线顾问,我知道我应该将以下段添加到我的链接器命令:

${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

我的环境也知道$F95ROOT$MKLROOT。事实上,如果我喜欢

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通过将SConstruct文件写为

来做同样的事情
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']

然后SCons执行以下命令:

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

看起来SCons将f95root+'/lib/intel64/libmkl_lapack95_lp64.a'中指定的静态库env['LIBS']视为共享库,并且链接器未能找到这样的共享库。 如果我知道如何在这种特定情况下为构建指定静态库,这可能就足够了。如果你能告诉我怎么做,我也会很高兴。 尽管如此,我认为有时链接器选项,标志和参数的顺序可能很重要,而且如果在使用SCons时对它们的顺序有任何控制,我感兴趣。

编辑于3月22日星期三00:53:34 IST 2017

我发现我可以通过将source命令与Program()命令一起添加到其他源文件来指定静态库,而不是将其列在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真的非常聪明,能够总是成功地找出选项,标志和参数的顺序。

1 个答案:

答案 0 :(得分: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 ])