我有一些使用包含模块的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)}