Linux下的头文件搜索路径

     对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置、连接库位置等),然后生成Makefile以编译程序。可以进入该软件的目录,执行"./configure --help"命令查看使用帮。

一个程序能正确编译、链接、运行需要满足3个条件:预处理时能找到头文件,连接时能找到库(静态库或动态库),运行时能找到库。下面介绍头文件的搜索路径

GCC 搜索头文件有三种策略:

1.内定搜索目录,这是编译器自身预设的目录。由于是内定的,一定会搜索,所以总是最后才搜索。

2.手动指定搜索目录。可以在执行配置命令configure前,通过环境变量C_INCLUDE_PATH进行设定;也可以在执行配置命令configure时,通过-I选项进行指定。

3.手动指定不进行搜索的目录。这是在执行配置命令时,使用-nostdin选项进行指定。

-nostdinc选项

使编译器不在系统缺省的头文件目录里面找头文件,一般和 -I 联合使用,明确限定头文件的位置。

-nostdin C++选项

规定不在 g++ 指定的标准路经中搜索,但仍在其他路径中搜索。此选项 在创libg++库使用

GCC指定头文件的方式

在程序中,常用两种方法来包含头文件:

#include <headerfile.h> 
#include "headerfile.h"

当#include <headerfile.h> 时,编译时按照"编译命令指定目录--->--->系统预设目录--->编译器预设"的顺序搜索头文件。

当#include "headerfile.h",编译时按照"源文件当前目录---->编译命令指定目录--->系统预设目录--->编译器预设"的顺序搜索头文件。

编译命令指定目录

"指定的"头文件目录是编译程序时使用" -I "选项来指定目录。举个例子:

mkdir -p /work/AAA/include /*临时目录,测试用*/ 
mkdir -p /work/BBB/include /*临时目录,测试用*/

export C_INCLUDE_PATH=/work/AAA/include

echo 'main() {}' | arm-linux-gcc -I/work/BBB/include -E -v -

得到以下输出内容,从中可以看到查找头文件时的路径及优先顺序:

... 
 #include "....." search starts here: 
#include <.....> search starts here:

/work/BBB/include 
/work/AAA/include

...

系统预设目录

系统预设的头文件目录是通过环境变量C_INCLUDE_PATH来设置的,这个变量的值要在执行配置命令configure之前设置。

编译器预设目录

编译器预设目录由编译器自己决定的,由程序代码决定的,这是不需要工人设置或指定的。

可以总结出头文件的查找路径及优先顺序:

1.如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。 
2.如果编译时使用"-I/some/dir",则在/some/dir中查找。
3.如果设置了环境变量C_INCLUDE_PATH,则在指定的目录中查找。
4.最后在编译器预设的路径中查找,这是不需要指定的,编译时一定会在该路径中搜索所需的头文件。

所以,编译程序时如果出现了找不到头文件的错误,可以通过设置C_INCLUDE_PATH或给编译器设置"-I"选线来指定头文件目录,这可以在执行配置命令configure之前设置C_INCLUDE_PATH或CFLAGS,如果不设置CFLAGS,它的默认值为"-g -O2",比如:

export C_INCLUDE_PATH="/some/dir/1:/some/dir/2"
export CFLAGS = "-g -O2 -I/some/dir" #如果设置了C_INCLUDE_PATH,就可以不设置CFLAGS

./configure

还有更好的方法,当明确知道要使用哪个动态库时,可以通过pkg-config命令获知要使用这个库时编译时的参数、连接时的参数。

先执行一下命令体验一下:

export PKG_CONFIG_PATH=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/pkgconfig

pkg-config --cflags uuid -I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include

.头文件搜索路径

gcc 在编译时如何去寻找所需要的头文件 :


-I选项指定的目录--->gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH--->再找编译器内定目录

如果装gcc的时候,是有给定的prefix的话,那么就是

/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

posted @ 2015-02-26 17:10  心哲  阅读(11799)  评论(0编辑  收藏  举报