我有一些使用包含模块的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
- 运行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
。
答案 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:/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别名,但是这样灵活性会降低,并且在很多情况下都不会起作用。
答案 1 :(得分:0)
如果您使用的是Makefile,我可以使用subst
命令将其工作。对于文件中的每个路径,这会将:
替换为-I
。
usr/bin/gfortran e04ucfe.f90 -lnag_nag -I${subst :, -I,$(CPATH)}