【问题标题】:Fortran: Hardcode some code in dependency on an environment variableFortran:硬编码一些依赖于环境变量的代码
【发布时间】:2025-11-23 13:25:02
【问题描述】:

你好, 如果在编译时设置了环境变量“XYZ”,那么我想要的部分:

write (STDOUT,*) "Compiled with XYZ"
here one more function call bla()

被编译成二进制文件。如果不是,那就不是。 有什么办法吗? 非常感谢!

【问题讨论】:

    标签: binary fortran environment hardcode


    【解决方案1】:

    编译时不能检查环境变量,但可以将选项传递给编译器——称为预处理。这没有大量记录,但至少适用于 gfortran 和 intel ifort。在编译行上使用或不使用“-DMYOPTION”(或您选择的任何选项名称)。然后在代码中:

    #ifdef MYOPTION
    Fortran source code
    #else
    Fortran source code
    #endif
    

    显然预处理器行必须从第一列开始。

    如果您使用文件类型“F90”,则会自动调用预处理器,否则您可以使用编译器选项来调用此步骤。

    也许这会满足您的需求?如果没有,您可以使用命令脚本来检查环境变量并根据其值使用不同的编译命令,以使预处理器方法响应环境变量。

    当然,您可以在运行时使用内在的 get_environment_variable 来检查环境变量。简单地使用 if 语句来响应一个值可能会更容易。

    【讨论】:

    • 好的,谢谢,这正是我要找的 :) 只是一点点补充:还需要“-fpp”标志(在 mpif90 上)通过“-Dvarname”在通常的 .f- 上传递预处理器标志文件:)
    【解决方案2】:

    作为 Fortran 2008 标准的一部分,有用于查找编译器选项和编译它的版本的内在函数。 compiler optionscompiler version。 Fortran 编译器正在慢慢跟上新标准。 gfortran 有,它看起来不像 ifort 12 有:

    program compilerinfo
        use iso_fortran_env
        implicit none
    
        print *,'This program was compiled with ', compiler_version()
        print *,'with flags ', compiler_options()
    end program compilerinfo
    

    跑步给了

    $ ./compilerinfo
     This program was compiled with GCC version 4.6.0
     with flags -mtune=generic -march=x86-64
    

    【讨论】:

    • 不过,这些不是环境变量。
    • 感谢您的帖子,但 MSB 的帖子非常成功:)
    • 不,MSB 的工作更普遍;我曾经使用过的代码之一使用了这个(再次,用于编译器信息)。但是,如果您确实想要“编译”信息,这将起作用(很快...)
    【解决方案3】:

    没有只有最新的 Fortran 编译器才提供这样的功能。

    最近的机制是编写一个程序,该程序获取环境变量并编写一个包含所需信息的 Fortran 子例程。添加到项目构建中:

    1. 运行程序抓取环境变量并编写子程序
    2. 编译子程序
    3. 将对象链接到项目的其余部分。

    编辑以反映 Fortran 2008+ 编译器

    【讨论】:

    • 其实所有的fortran2008编译器都带有“compiled-with”选项...
    • @Jonathan:你知道多少 fortran 2008 编译器? ;)
    • @eriktous:诚然,还不够。但他们中的大多数都实现了一些不断增长的子集......