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

Dav*_*ner 5 gcc fortran path include gfortran

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

为了测试这一点,我一直在使用其中一个NAG示例代码.

这有效:

$ gfortran e04ucfe.f90 -lnag_nag -I/opt/NAG/fll6a23dfl/nag_interface_blocks
Run Code Online (Sandbox Code Playgroud)

这不起作用:

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,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/'`
Run Code Online (Sandbox Code Playgroud)

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

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

ama*_*rea 3

据我所知gfortran不支持这一点,这很烦人。但可以解决这个问题。如果您命名以下脚本gfortran并将其放入您的目录中,$PATH该目录在包含真实脚本的目录之前进行搜索gfortran,那么您将获得您想要的行为,并$CPATH透明地扩展为 -I 参数:

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

请记住将其标记为可执行文件。例如,如果我的$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
Run Code Online (Sandbox Code Playgroud)

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