gfortran包含路径 - 是否有传递多个-I选项的替代方法?

时间:2014-06-02 09:47:34

标签: gcc path include fortran gfortran

我有一些使用包含模块的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 - 运行gfortran并可以看到它查看其他环境变量(例如常规PATH)但不是CPATH

我可以解决这个问题:

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

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

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

2 个答案:

答案 0 :(得分:2)

据我所知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:/bingfortran位于/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别名,但是这样灵活性会降低,并且在很多情况下都不会起作用。

答案 1 :(得分:0)

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

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