对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本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/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--->再找编译器内定目录
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include