【发布时间】:2017-03-22 07:08:49
【问题描述】:
如何让SCons 按我想要的顺序使用链接器参数、选项和标志?
更具体地说,我正在尝试在 Linux 上使用 GNU gfortran 编译器从 Fortran 源代码和英特尔数学核心库构建一个程序。从 Intel 的链接行顾问中,我知道我应该将以下段附加到我的链接器命令中:
${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。但是,如果我尝试通过将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把env['LIBS']中指定的静态库f95root+'/lib/intel64/libmkl_lapack95_lp64.a'当成共享库了,链接器找不到这样的共享库。
如果我知道如何在这种特殊情况下为构建指定静态库就足够了。如果你能告诉我怎么做,我也会很高兴。
不过,我认为有时链接器选项、标志和参数的顺序可能很重要,我感兴趣的是在使用 SCons 时是否可以控制它们的顺序。
编辑于 2017 年 3 月 22 日星期三 00:53:34 IST
我发现我可以通过将静态库与其他源文件一起添加到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 不关心单个编译器。
-
好的。谢谢你。没关系。我想知道要放置哪个 fortran 或 gfortran 标记。两个都好。
-
为什么不使用 LIBPATH 作为相关库的位置? (libmkl_lapack95_lp64.a)
标签: linker fortran gfortran scons intel-mkl