首页 > 代码库 > c项目中指定头文件目录
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中,那么你需要将你的程序编译为静态库或动态库,添加到特定目录中。这涉及到动态库、静态库的内容,我将在另一篇文章中说明。
希望读完这篇文章后,希望能对你布局自己的头文件有所帮助,如有错误请批评指正,谢谢!