glibc的头文件 linux_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

#include "headerfile.h"

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

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

编译命令指定目录

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

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

mkdir -p /work/BBB/include /*临时目录,测试用*/export C_INCLUDE_PATH=/work/AAA/includeecho '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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值