为什么`/ usr / include`不在gcc默认搜索路径中

时间:2018-08-23 16:17:47

标签: c++ linux gcc

众所周知,gcc在编译目标时会搜索一些默认目录, 我使用gcc -print-search-dirs commnd并得到以下信息:

install: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/
programs: =/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/bin/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/bin/
libraries: =/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/x86_64-redhat-linux/4.8.5/:/lib/../lib64/:/usr/lib/x86_64-redhat-linux/4.8.5/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/lib/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/

对此我有两个问题:

  1. /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../x86_64-redhat-linux/bin/是什么意思,为什么这样写?

  2. 为什么/usr/include不存在?gcc是否不需要知道头文件在哪里?

1 个答案:

答案 0 :(得分:2)

关于问题1 ,我在gcc mailing list中发现了这一点:

  

请注意,只有在存在a / b / c的情况下,a / b / c /../../../ x才会存在。

因此,如果存在/usr/x86_64-redhat-linux/bin/,则您的gcc只会在/usr/lib/gcc/x86_64-redhat-linux/4.8.5/中搜索。

请注意,我在arch上有类似的搜索目录,与/usr/x86_64-redhat-linux/等效的搜索目录不存在,因此我不确定为什么还要包含它们,但是Linux的目录臭名昭著结构,因此对于其他发行版来说可能很重要。

关于2 ,在手册页中:

  

-print-search-dirs

      Print the name of the configured installation directory and a list of program and library directories gcc searches---and don't do anything else.

      This is useful when gcc prints the error message installation problem, cannot exec cpp0: No such file or directory.  To resolve this you either need to put cpp0 and the other
       compiler components where gcc expects to find them, or you can set the environment variable GCC_EXEC_PREFIX to the directory where you installed them.  Don't forget the
       trailing /.

这似乎不是打印库路径,而是打印gcc期望找到其调用以完成工作的组件的路径。

要查找预处理器搜索的路径,请输入

`gcc -print-prog-name=cc1plus` -v

`gcc -print-prog-name=cc1` -v

用于C预处理器。

相关问题