如何正确编译包含#:if defined条件块的Fortran dlyap子程序代码
问题根源
你使用的代码中#:if、#:else、#:endif不属于标准C预处理器(CPP)的语法,是Fypp(Fortran Python预处理器)的专属指令,直接用gfortran自带的-cpp参数无法识别这类指令,会导致两个版本的dlyap子程序同时暴露给编译器,触发重复定义的编译错误。
正确编译步骤
- 首先安装Fypp工具,可直接通过pip安装:
pip install fypp - 按需求选择dlyap版本,用Fypp预处理源文件:
- 如需使用依赖SLICOT库的dlyap版本,执行命令:
fypp -D SLICOT fortress_linalg.f90 fortress_linalg_preprocessed.f90 - 如需使用内置纯Fortran实现的dlyap版本,无需定义SLICOT宏,执行命令:
fypp fortress_linalg.f90 fortress_linalg_preprocessed.f90
- 如需使用依赖SLICOT库的dlyap版本,执行命令:
- 用gfortran编译预处理后的文件即可:
gfortran -c fortress_linalg_preprocessed.f90
你也可以通过管道合并预处理和编译步骤,不需要生成中间文件:
# 按需选择是否加-D SLICOT参数 fypp -D SLICOT fortress_linalg.f90 | gfortran -c -x f95 -o fortress_linalg.o -
注意:如果选择SLICOT版本的dlyap,最终链接程序时需要额外添加SLICOT、BLAS、LAPACK库的链接参数,否则会出现未定义引用错误。
内容的提问来源于stack exchange,提问作者Fortranner
相关产品推荐
相关产品推荐

