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

Posted

技术标签:

【中文标题】为啥`/usr/include`不在gcc默认搜索路径中【英文标题】:why `/usr/include` is not in gcc default search path为什么`/usr/include`不在gcc默认搜索路径中 【发布时间】:2018-08-23 16:17:47 【问题描述】:

众所周知,gcc在编译targets的时候会搜索一些默认的目录, 我使用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/

对此我有两个问题:

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

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

【问题讨论】:

.. 表示返回(上)一个目录。至于为什么,我不知道 编译器不搜索 any 头文件;预处理器负责处理它们。试试cpp -v 【参考方案1】:

关于问题1,我在gcc mailing list找到了这个:

注意 a/b/c/../../../x 只有在 a/b/c 存在时才会存在。

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

请注意,我在 arch 上也有类似的搜索目录,而 /usr/x86_64-redhat-linux/-equivalent 不存在,所以我不确定它们为什么会被包括在内,但 Linux 有一个众所周知的非标准化目录结构,所以也许它对其他发行版很重要。

关于 2,来自手册页:

-打印搜索目录

      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 预处理器。

【讨论】:

对于问题(1),您没有回答“为什么要这样写[它]”。路径通常是相对于暂存的。发行版总是为分期而构建;其他软件包商所做的事情会受到打击或错过。用户很少使用相对路径。另请参阅DESTDIR,例如GNU Make manual 或GNU Coding Standards。 @jww 所以你是说gcc,如果安装在/usr/local/...而不是/usr/...,那么也会自动在/usr/local/x86...中找到1)目录?或者它只是make installing gcc 的保留?

以上是关于为啥`/usr/include`不在gcc默认搜索路径中的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 GCC 的配置以进行包含搜索?

为啥我不能重定向 gcc -H 的输出

linux-gcc 编译时头文件和库文件搜索路径

怎么在linux环境变量中设置多个gcc头文件搜索路径?

链接库

为啥我的 gcc 不在 /usr/bin/gcc 中,即使安装了 Xcode 4.3?