如何查看gcc编译器编译时的include头文件搜索路径、各默认路径通常用于存放何种头文件、gcc编译器搜索头文件时不会去搜索默认路径中的子目录怎么办【头文件的目录嵌套】?

01-如何查看gcc编译器编译时的头文件搜索路径

扩展阅读:gcc的链接器的相关知识要点,这里面我写了如何查看链接器的默认搜索目录。
这里说下如何查看gcc编译器编译时的头文件搜索路径,用下面的命令:

echo | arm-buildroot-linux-gnueabihf-gcc -E -v -

输出结果中有下面的内容:
在这里插入图片描述

#include "..." search starts here:
#include <...> search starts here:
 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include
 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include-fixed
 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/../../../../arm-buildroot-linux-gnueabihf/include
 /home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include
End of search list.

这里边就列举了#include <...> 的搜索路径。
值得注意的是:在上面的路径中,… 表示父目录。工具链在运行时会解析这些相对路径并转换为实际的绝对路径。
例如:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib

在下面的目录结构下:
在这里插入图片描述
会转化为:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib

因为 bin/../ 实际上指向的是 bin 目录的父目录。
基于这个原理,我们把上面的四个目录路径转化为绝对路径为:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include-fixed

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/include

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include

02-四个默认搜索头文件路径通常放什么类型的头文件,自己编译的第三方库的头文件放于哪里?

问:我对上面的四个相对路径进行了手工解析,结果如下:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib/gcc/arm-buildroot-linux-gnueabihf/7.5.0/include-fixed

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/include

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include

如果我想把tslib库的头文件放到这几个目录中,你说放到哪个目录下比较合适?

以下是对这几个目录的分析和建议:

目录分析

  1. .../7.5.0/include

    • 用途:这是 GCC 特定的标准头文件目录,通常包含 GCC 自身需要的内部头文件或特定版本相关的内容。
    • 建议:不建议放置第三方库头文件。这是 GCC 的私有目录,手动添加可能导致编译器行为异常。
  2. .../7.5.0/include-fixed

    • 用途:包含经过修正的头文件,可能用于替代标准库中的一些问题文件。
    • 建议:不建议使用。这个目录的内容通常由工具链维护,放置 tslib 头文件可能造成冲突或意外问题。
  3. .../arm-buildroot-linux-gnueabihf/include

    • 用途:通常是工具链的通用标准头文件目录,包括标准库头文件和常用库头文件。
    • 建议:可以考虑放置,但如果 tslib 是面向应用程序的库,放这里可能会增加工具链维护的复杂性。
  4. .../sysroot/usr/include

    • 用途:这是目标系统的头文件目录,通常包含与目标系统相关的库头文件(如 glibc 或其他系统级库)。
    • 建议推荐放置这里。这是最常用的目录,符合目标文件系统的标准组织结构。应用程序或系统工具在编译时可以直接找到这些头文件。

推荐目录

tslib 库的头文件tslib.h放在上面四个目录中的最后一个,即:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/

03-gcc编译器搜索头文件时不会去搜索默认路径中的子目录怎么办【默认路径中嵌套子目录怎么办?】

如果你的库的头文件只是单一的一个头文件,那么可以在上面提到的几个目录中选一个来存放,这样编译器是可以搜索到的。
但是如果你的库的头文件不只一个头文件,而是一个目录,那是不能直接放目录的,因为默认情况下,GCC 编译器不会递归搜索 include 目录中的子目录。那这种情况下怎么办呢?请往后看。

比如tslib库的头文件就一个,那我可以直接放于下面这个目录中:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/

在这里插入图片描述
这是可以的。

但是像freetype库它的头文件的目录结构就比较复杂,它的结构如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

E:\freetype2
│  ft2build.h
│
└─freetype
    │  freetype.h
    │  ftadvanc.h
    │  ftbbox.h
    │  ftbdf.h
    │  ftbitmap.h
    │  ftbzip2.h
    │  ftcache.h
    │  ftchapters.h
    │  ftcid.h
    │  ......
    │
    └─config
            ftconfig.h
            ftheader.h
            ftmodule.h
            ftoption.h
            ftstdlib.h

这种情况下为了让编译器能进入默认搜索路径的子目录中去搜索,你需要在默认搜索路径中放一个头文件,让这个头文件去告诉编译器进入子目录中去搜索,比如freetype库中的头文件ft2build.h
在这里插入图片描述
它里面的内容如下:

#ifndef FT2BUILD_H_
#define FT2BUILD_H_

#include <freetype/config/ftheader.h>

#endif /* FT2BUILD_H_ */

我们看到,它里面其实就一条语句:

#include <freetype/config/ftheader.h>

这条语句就会让编译器以上面的四个默认搜索路径为根路径,然后加上相对路径freetype/config/ftheader.h去查找相应的头文件。
我实测过,把文件ft2build.h放在一个默认搜索路径中,把目录freetype放于另一个搜索路径中,相关的freetype的工程源码也能顺利编译哦。

而在文件freetype/config/ftheader.h中其实又是各需要的头文件的相对路径,摘录如下:

#define FT_TYPES_H  <freetype/fttypes.h>

#define FT_LIST_H  <freetype/ftlist.h>

#define FT_OUTLINE_H  <freetype/ftoutln.h>

......

所以总结下,尽管编译器不会进入默认路径的子目录中去搜索头文件,但你可以在其默认路径存放的头文件中存放中为需要的头文件指明相对路径,这样编译器是可以获取到相关的头文件的。

对于freetype库而言,我的操作是把其make install获取到的头文件目录freetype和头文件ft2build.h放于下面这个目录中:

/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊虹AI笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值