01-如何查看gcc编译器编译时的头文件搜索路径
扩展阅读:gcc的链接器的相关知识要点,这里面我写了如何查看链接器的默认搜索目录。
这里说下如何查看gcc编译器编译时的头文件搜索路径,用下面的命令:
echo | arm-buildroot-linux-gnueabihf-gcc -E -v -
- 1
输出结果中有下面的内容:
#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.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
这里边就列举了#include <...>
的搜索路径。
值得注意的是:在上面的路径中,… 表示父目录。工具链在运行时会解析这些相对路径并转换为实际的绝对路径。
例如:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/../lib
- 1
在下面的目录结构下:
会转化为:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib
- 1
因为 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果我想把tslib库的头文件放到这几个目录中,你说放到哪个目录下比较合适?
以下是对这几个目录的分析和建议:
目录分析
-
.../7.5.0/include
- 用途:这是 GCC 特定的标准头文件目录,通常包含 GCC 自身需要的内部头文件或特定版本相关的内容。
- 建议:不建议放置第三方库头文件。这是 GCC 的私有目录,手动添加可能导致编译器行为异常。
-
.../7.5.0/include-fixed
- 用途:包含经过修正的头文件,可能用于替代标准库中的一些问题文件。
- 建议:不建议使用。这个目录的内容通常由工具链维护,放置
tslib
头文件可能造成冲突或意外问题。
-
.../arm-buildroot-linux-gnueabihf/include
- 用途:通常是工具链的通用标准头文件目录,包括标准库头文件和常用库头文件。
- 建议:可以考虑放置,但如果
tslib
是面向应用程序的库,放这里可能会增加工具链维护的复杂性。
-
.../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/
- 1
03-gcc编译器搜索头文件时不会去搜索默认路径中的子目录怎么办【默认路径中嵌套子目录怎么办?】
如果你的库的头文件只是单一的一个头文件,那么可以在上面提到的几个目录中选一个来存放,这样编译器是可以搜索到的。
但是如果你的库的头文件不只一个头文件,而是一个目录,那是不能直接放目录的,因为默认情况下,GCC 编译器不会递归搜索 include 目录中的子目录。那这种情况下怎么办呢?请往后看。
比如tslib库的头文件就一个,那我可以直接放于下面这个目录中:
/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/include/
- 1
这是可以的。
但是像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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
这种情况下为了让编译器能进入默认搜索路径的子目录中去搜索,你需要在默认搜索路径中放一个头文件,让这个头文件去告诉编译器进入子目录中去搜索,比如freetype库中的头文件ft2build.h
它里面的内容如下:
#ifndef FT2BUILD_H_
#define FT2BUILD_H_
#include
#endif /* FT2BUILD_H_ */
- 1
- 2
- 3
- 4
- 5
- 6
我们看到,它里面其实就一条语句:
#include
- 1
这条语句就会让编译器以上面的四个默认搜索路径为根路径,然后加上相对路径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>
......
- 1
- 2
- 3
- 4
- 5
- 6
- 7
所以总结下,尽管编译器不会进入默认路径的子目录中去搜索头文件,但你可以在其默认路径存放的头文件中存放中为需要的头文件指明相对路径,这样编译器是可以获取到相关的头文件的。
对于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/
- 1



评论记录:
回复评论: