【问题标题】:gfortran include path -- is there an alternative to passing multiple -I options?gfortran 包含路径 - 是否有传递多个 -I 选项的替代方法?
【发布时间】:2014-07-22 09:38:14
【问题描述】:

我有一些使用包含模块的 Fortran 代码,我想知道哪些环境变量实际上可以用来设置包含路径。

为了测试这一点,我一直在使用 NAG 示例代码之一。

这行得通:

$ gfortran e04ucfe.f90 -lnag_nag -I/opt/NAG/fll6a23dfl/nag_interface_blocks

这不起作用:

$ export CPATH=/opt/NAG/fll6a23dfl/nag_interface_blocks
$ gfortran e04ucfe.f90 -lnag_nag
e04ucfe.f90:10.37:

       USE nag_library, ONLY : nag_wp
                                     1
Fatal Error: Can't open module file 'nag_library.mod' for reading at (1): No such file or directory

但是,GCC/GFortran 文档指出:

gfortran 编译器目前不使用任何环境 变量来控制其操作超出那些影响 gcc的操作。

(见https://gcc.gnu.org/onlinedocs/gfortran/Environment-Variables.htmlhttps://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#Environment-Variables

我已经尝试ltrace-ing gfortran 运行,并且可以看到它查看其他环境变量(例如常规 PATH)但不是 CPATH

我可以解决这个问题:

gfortran e04ucfe.f90 -lnag_nag `echo -I$CPATH | sed -e 's/:/ -I/'`

...但是为什么这是必要的? CPATH 适用于 gcc,包括除 C/C++ 以外的其他语言,那么为什么这不适用于 gfortran? 我可以成功地使用与 gfortran 的 gcc 的 CPATH 相同的效果,以避免传递多个 -I 参数吗?

旁注:LIBRARY_PATH 以类似的方式工作正常,用于替换 gfortran 命令行上的 -L/path/to/libs

【问题讨论】:

  • 文档状态:“CPATH 指定要搜索的目录列表,就像使用 -I 指定一样,但在命令行上使用 -I 选项给出的任何路径之后。无论正在预处理哪种语言。”
  • 其实,我担心“被预处理”是这里的重点。我将检查 gfortran 是否通过预处理器运行包含的内容,或者它们是否以其他方式完成......
  • 是的,它适用于 C 预处理器,即使在 Fortran 源代码上运行,也不适用于内部 Fortran 语言的东西。
  • 所以我想我的问题切换到“gfortran 的 CPATH 变量是否有等价物,以避免需要传递 -I 参数?”
  • 是的,我也不这么认为,我也想知道,但找不到解决方案。顺便提一句。 CPATH 技巧适用于 ifort。

标签: gcc path include fortran gfortran


【解决方案1】:

据我所知gfortran 不支持这个,这很烦人。但有可能解决它。如果您将以下脚本命名为 gfortran 并将其放在您的 $PATH 中的一个目录中,该目录在其中包含真正 gfortran 的目录之前被搜索,那么您将拥有您想要的行为,$CPATH 显然是扩展为 -I 参数:

#!/bin/bash
/path/to/gfortran $(for i in ${CPATH//:/ }; do echo -I"$i"; done) "$@"

记得将其标记为可执行文件。例如,如果我的$PATH/home/amaurea/local/bin:/usr/local/bin:/usr/bin:/bin 并且gfortran 住在/usr/local/bin,我会将其设置为

$ cd /home/amaurea/local/bin
$ cat <<HERE > gfortran
#!/bin/bash
/usr/bin/gfortran $(for i in ${CPATH//:/ }; do echo -I"$i"; done) "$@"
HERE
$ chmod a+x gfortran

或者,您可以将其表述为 shell 别名,但这会不太灵活,并且在很多情况下都不起作用。

【讨论】:

    【解决方案2】:

    如果您使用的是 Makefile,我可以使用 subst 命令使其工作。这会将文件中每个路径的 : 替换为 -I

    usr/bin/gfortran e04ucfe.f90 -lnag_nag -I${subst :, -I,$(CPATH)}
    

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 1970-01-01
      • 2011-05-16
      • 2013-07-08
      • 2023-03-20
      • 2019-08-12
      • 1970-01-01
      • 2012-02-16
      • 2020-12-06
      相关资源
      最近更新 更多