本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是如何找到它的呢。在此之前,先了解一个基本概念。
头文件是一种文本文件,使用文本编辑器将代码编撰好以后,以扩充名.h保存就行了。头文件中通常放一些重复使用的代码,比如函数申明、变量申明、常数定义、宏的定义等等。当使用#include句子将头文件引用时,相当于将头文件中所有内容,复制到#include处。#include有两种写法方式,分别是:
#include:直接到系统指定的个别目录中去找个别头文件。
#include“”:先到源文件所在文件夹去找,之后再到系统指定的个别目录中去找个别头文件。
#include文件可能会带来一个问题就是重复应用,如a.h引用的一个函数是某种实现,而b.h引用的这个函数却是另外一种实现,这样在编译的时侯将会出现错误。所以,为了防止由于重复引用而引起的编译错误,头文件常具有:
#ifndefLABEL
#defineLABEL
//代码部份
#endif
的格式。其中LABEL为一个惟一的标号,命名规则跟变量的命名规则一样。常按照它所在的头文件名来命名,比如,倘若头文件的文件名称作hardware.h,这么可以这样使用:
#ifndef__HARDWARE_H__
#define__HARDWARE_H__
//代码部份
#endif
这样写的意思就是linux include 头文件 路径,假如没有定义__HARDWARE_H__,则定义__HARDWARE_H__,并编译下边的代码部份,直至遇见#endif。这样当重复引用时,因为__HARDWARE_H__早已被定义,则下边的代码部份就不会被编译了,这样就防止了重复定义。
一句话,头文件事实上只是把一些常用的命令集成在上面,你要用到哪方面的命令就载入那个头文件就可以了。
gcc找寻头文件的路径(根据1->2->3的次序)
1.在gcc编译源文件的时侯,通过参数-I指定头文件的搜索路径,倘若指定路径有多个路径时,则根据指定路径的次序搜索头文件。命令方式如:“gcc-I/path/where/theheadfile/insourcefile.c“,这儿源文件的路径可以是绝对路径,也可以是相对路径。eg:
设当前路径为/root/test,include_test.c假如要包含头文件“include/include_test.h“,有两种方式:
1)include_test.c中#include“include/include_test.h”或者#include"/root/test/include/include_test.h"redhat linux 9.0,之后gccinclude_test.c即可
2)include_test.c中#include或则#include,之后gcc–Iincludeinclude_test.c也可
2.通过查找gcc的环境变量C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/OBJC_INCLUDE_PATH来搜索头文件位置。
3.再找内定目录搜索,分别是
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
最后一行是gcc程序的库文件地址,各个用户的系统上可能不一样。
gcc在默认情况下,就会指定到/usr/include文件夹找寻头文件。
gcc还有一个参数:-nostdinc,它使编译器不再系统缺省的头文件目录上面找头文件,通常和-I联合使用,明晰限定头文件的位置。在编译驱动模块时linux include 头文件 路径,因为非凡的需求必须强制GCC不搜索系统默认路径雨林木风linux,也就是不搜索/usr/include要用参数-nostdinc,还要自己用-I参数来指定内核头文件路径,这个时侯必须在Makefile手指定。
4.当#include使用相对路径的时侯,gcc最终会按照前面那些路径,来最终建立出头文件的位置。如#include就是包含文件/usr/include/sys/types.h