gfortran include path——是否有传递多个-I选项的替代方法?



我有一些使用包含模块的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.html和https://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

据我所知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别名,但这将不那么灵活,并且在许多情况下不起作用。

如果您正在使用Makefiles,我使用subst命令使其工作。这将用-I替换文件中每个路径的:

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

最新更新