如何让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真的非常聪明,能够总是成功地找出选项,标志和参数的顺序。
答案 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 ])