Linux c程序中的头文件指定

在Linux下开发c程序时,经常引用各类库,通常通过包含多个#include<xxx.h>来完成库的引用,对背后的一些机制没有完全理解。本文重点说明c程序开发中的库文件引用、动态链接库和静态链接库中的一些常见疑问。不特别指明时,编译器指定GCC。

在学习c语言预处理过程时,我们了解到#include <xxx.h>和#include “xxx.h”的差别,前者在指定目录中寻找头文件,后者则在源文件所在目录中寻找头文件,如果没有找到,再到指定目录中继续寻找。通常我们在引用头文件时最好区别使用””和<>,这样可以加速预处理效率。

在Linux系统中,指定目录通常是/usr/include目录,因此我们在源程序中使用#include <stdio.h>,编译器实际会去寻找/usr/include/stdio.h文件。实际项目开发中,如果我们有多个头文件,通常都将头文件集中在单独的目录中,对于这类情况我们不喜欢每次#include都要包括一长串的路径,这时候我们可以在编译命令中加入-I命令来指定头文件目录,命令格式是:

                               gcc –I 头文件文件夹(绝对、相对路径均可) 源文件(可以是多个)

我们首先说明一下GCC搜索头文件顺序,在以一个小例子来说明如何指定自己的头文件目录。

GCC在预处理阶段,搜索头文件顺序是:

a、 由-I指定的路径开始搜索,-I指定多个路径时顺序搜索。

b、 gcc环境变量指定的路径:C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH。

c、 内定目录:/usr/include/,/usr/local/include/,/usr/lib/gcc-lib/i386-linux/xxx/include/等。

 

注意:编译时指定-nostdinc选项后,GCC不会到默认目录中寻找头文件,仅在-I指定的目录中寻找。

我们以一个小例子来说明如何使用-I选项指定自定义头文件目录:

有如下几个源文件main.c,stdio.c include/stdio.h

     main.c代码如下:

   1:  #include <stdio.h>
   2:   
   3:  int main(int argc, char *argv[])
   4:  {
   5:   
   6:      return myfunc();
   7:  }

  

    stdio.c代码如下:

   1:  int myfunc(void)
   2:  {
   3:   
   4:      return 10;
   5:  }

 

   include文件夹下stdio.h代码如下:

   1:  #ifndef _STD_IO_H_
   2:  #define _STD_IO_H_
   3:   
   4:  int myfunc(void);
   5:   
   6:  #endif

 

首先,我们直接编译生成main,不加其它选项,结果如下:

   1:  $:gcc -o main main.c
   2:  /tmp/cchbeKLd.o: In function `main':
   3:  main.c:(.text+0x7): undefined reference to `myfunc'
   4:  collect2: ld returned 1 exit status

因为标准库stdio.h中没有myfunc(void)函数,因此编译肯定失败。

 

 

然后,我们引用自己的库文件,结果如下:

   1:   ##不引用标准库,设置include为库查找目录
   2:  $:gcc -nostdinc -I include -o main stdio.c main.c    
   3:  $:./main      ##执行没有任何输出
   4:  $:echo $?   ##打印main函数返回值
   5:  $:10           ##查看main.c文件,返回值为10,验证正确

从执行结果中看到顺利调用了myfunc()函数。

 

在实际项目中,可以在makefile中添加自己的引用目录,也可以在环境变量C_INCLUDE_PATH中添加自己的目录。如果将自己的头文件目录添加到C_INCLUDE_PATH中,那么你需要将你的程序编译为静态库或动态库,添加到特定目录中。这涉及到动态库、静态库的内容,我将在另一篇文章中说明。

希望读完这篇文章后,希望能对你布局自己的头文件有所帮助,如有错误请批评指正,谢谢!

posted @ 2014-03-07 22:25  ericghw  阅读(3122)  评论(0编辑  收藏  举报