【发布时间】:2020-05-01 04:50:24
【问题描述】:
如何找到 gfortran 的包含文件的默认搜索路径?
对于gcc,过去的问答显示了这个网站:
https://gcc.gnu.org/onlinedocs/gcc-4.1.1/cpp/Search-Path.html#Search-Path
但是,
- 我不确定它是否适用于
gfortran。 - 我认为它并不总是适用。
例如,在 Linux 服务器上,(因为没有任何其他方法)我这样做了
strace gfortran try.f90 > tmp.txt 2>&1
发现这个特定的gfortran 搜索类似目录
/opt/intel/compilers_and_libraries_2016.2.181/linux/ipp/lib/intel64/x86_64-redhat-linux/4.4.7/finclude
它确实不搜索/usr/include。显然,这个特殊的gfortran 是英特尔 Fortran 编译器附带的并且是定制的。
所以,我的问题是,strace 是了解默认搜索路径的唯一方法吗? (我需要知道这一点,因为我正在远程帮助一位朋友。我无法直接访问他的机器。)
更新:我应该提到-print-search-dirs 选项。它不包括“包含”搜索路径:
gfortran -print-search-dirs | grep --color include
-print-search-dirs的输出不包括我上面的实验中strace指示的目录。
Update2:我刚刚发现 ubuntu 上的 gfortran 搜索仅 /usr/lib/gcc/x86_64-linux-gnu/7/finclude。我很惊讶它甚至不搜索/usr/include。到目前为止,似乎我们必须使用 -I/usr/include 而我们不需要 -L/usr/lib 。 . .有人知道这种不对称的原因吗?
更新3:下面的答案显示了如何列出包含搜索路径:
echo | gfortran -E -Wp,-v -
不幸的是,这个仅列出了预处理器的路径(用于#include),而不是用于 Fortran 语言的INCLUDE 语句。
您可以通过查看预处理器搜索的目录之一来验证这一点。例如,我在其中一个中找到了cpuid.h。所以,我比较了
include 'cpuid.h'
与
#include "cpuid.h"
在 Fortran 源程序中。当然,两者都会导致错误,但是错误消息清楚地表明,在前一种情况下,找不到文件,而在后一种情况下,找到包含文件并将其插入源代码中, > 导致编译错误。
顺便说一句,这个练习表明在我的 Linux 服务器上,gfortran 搜索 /usr/lib/gcc/ 。 . . /finclude 在其他目录中,而其预处理器搜索 /usr/lib/gcc/ 。 . . /include ,这是有道理的。
【问题讨论】:
-
我根据一些旧笔记更新了我的答案。我无法验证这些路径是否始终用于
INCLUDE,或者是否仅用于预处理器#include;但它可能值得一试。
标签: gfortran include-path