c项目中指定头文件目录

原创 2014年08月17日 16:14:28

在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中,那么你需要将你的程序编译为静态库或动态库,添加到特定目录中。这涉及到动态库、静态库的内容,我将在另一篇文章中说明。

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

版权声明:本文为博主原创文章,转载请注明出处。

visual studio C++ 手工管理头文件包含路径的方法

这里以VS2010为例,说明如何通过自定义项目属性来手工管理VC++目录。 第一步:打开一个VC++工程。 第二步: 选择视图菜单下的属性管理器。 第三步:右键点击我们的工程,选...
  • jzkdl
  • jzkdl
  • 2014年12月01日 14:03
  • 8626

gcc/g++使用第三方库时添加头文件路径和库文件路径的方法

本文总结了使用第三方库函数时将其路径告诉编译器(gcc和g++同理)的2种常用方式,并举例说明了每种方式的具体用法。...
  • arackethis
  • arackethis
  • 2015年01月31日 18:09
  • 10468

VS2008引入头文件包含目录和lib库目录

全局级别的引入 为VS所有项目设置包含目录和库目录,对所有项目都有效 如下图所示:工具-选项-项目和解决方案-VC++目录-包含文件:在此添加头文件目录即可 工具-选项-项目和解决方案-VC++目录-...
  • rankun1
  • rankun1
  • 2016年03月14日 14:18
  • 3802

ctags为系统头文件目录生成tags

ctags为系统头文件目录生成tags 2012-09-20 23:15:57 分类: LINUX 如果gcc正在编译c++文件,并且gcc版本大于2.8那么_...
  • zzcchunter
  • zzcchunter
  • 2014年06月22日 02:22
  • 555

cmake 添加头文件目录,链接动态、静态库

 罗列一下cmake常用的命令。 CMake支持大写、小写、混合大小写的命令。   1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_director...
  • shenya1314
  • shenya1314
  • 2017年04月13日 09:16
  • 2274

ctags为系统头文件目录生成tags

经常需要远程登录到Linux服务器上改配置、写程序,我使用的编辑器是vim。vim它小快灵,网络速度慢也能工作,并且vim+ctags+cscope的组合能很好的满足编程的时候经常用到的代码跳转功能,...
  • Challenge_C_PlusPlus
  • Challenge_C_PlusPlus
  • 2011年09月23日 15:40
  • 2362

cmake 添加头文件目录,链接动态、静态库

cmake 添加头文件目录,链接动态、静态库
  • boise
  • boise
  • 2017年11月24日 18:47
  • 74

ctags为系统头文件目录生成tags

经常需要远程登录到Linux服务器上改配置、写程序,我使用的编辑器是vim。vim它小快灵,网络速度慢也能工作,并且vim+ctags+cscope的组合能很好的满足编程的时候经常用到的代码跳转功能,...
  • Augusdi
  • Augusdi
  • 2014年10月14日 21:08
  • 2076

无需手动添加源文件和头文件目录的android.mk文件

不知道为什么,cocos2d-x火了这么久了,从win32工程转一个android工程并编译出包这个过程,居然到现在还没有一个一键转换为eclipse工程并且能直接正常编译的东西?大概是我孤陋寡闻不知...
  • Piao_Polar
  • Piao_Polar
  • 2013年06月28日 03:12
  • 7661

java mail 可以指定附件和要上传的文件目录

  • 2013年07月27日 01:42
  • 3.51MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c项目中指定头文件目录
举报原因:
原因补充:

(最多只允许输入30个字)