引言

前段时间看lua的时候,书中提到标准C是没有定义查找路径的,回想起来C的书籍中确实没有过多实没有提及文件包含的问题。在看linux网络编程的时候一些文件包含格式,以前也见过但是不理解为什么这么写,自己也没深入关注过这方面的问题。在配置eclipse,sublime,vs的文件包含、库文件、动态链接库相关的配置的时候,感觉配置参数和这些文件包含他们之间有那么一些隐隐约约的联系,感觉配置的这些参数,就是编译器,链接器相关命令行参数,也确实是如此。

如何包含文件的问题其实是一个文件查找的问题。例如php中对文件包含的规则就比较简单require或者include 后面加上文件路径,但是C语言中在自己的印象中一直好像没有相关的说法,于是翻了一下C程序语言设计这本书,呵呵。。果然是阳春白雪。。就那么一点点。。。不留心可能就忽略了,在工程之中却又是一个非常重要的问题。比如可以利用文件把一个大的工程分开,有利于模块化开发设计。

随即查阅了一些资料做个简单的小结。

查找路径

按照程序的时段可以划分为三个

  • 编译时的查找
  • 链接时的查找
  • 运行时查找

编译时的查找

include 文件包含格式:


  • 尖括号<>引起来
  • 用引号""引起来

引号引起来的首先在文件当前位置查找。如果查找不到,则和尖括号引起来的查找规则一样,规则和具体的实现有关。

gcc查找规则

可以使用 -v 参数查看到gcc查找的路径。

    gcc -v hello.c

<>查找规则


  1. 先搜索-I选项后的路径(-I选项指定的位置),然后是标准的系统头文件路径
  2. 查找通过环境变量添加的路径
  3. 在头文件中含有路径名。例如:#include <sys/time.h>,会在搜索的系统目录sys目录下寻找time.h文件。
  4. 头文件中不支持通配符,如*


链接时的查找

在命令行下可以使用 -L -l添加查找路径,也可以使用环境变量添加。含义分别表示

  • -L 查找的文件夹
  • -l 静态库文件

运行时查找

查找动态链接库。比如在Windows上运行某个程序的时候,弹出提示说缺少dll的情况,就是因为没有在指定的位置找到对应的DLL。一般把对应的DLL放在程序运行的位置,或者放在系统 C:\Windows\System32问题就解决了。

部分环境变量的含义


环境变量 含义
C_INCLUDE_PAT c 查找头文件的路径
CPATH  
CPLUS_INCLUDE_PAT C++ 查找头文件的路径
DEPENDENCIES_OUTPUT  
OBJC_INCLUDE_PATH  
SUNPRO_DEPENDENCIES  
LD_LIBRARY_PATH 查找动态链接库的路径
LIBRARY_PATH 查找静态库的路径
  • 详见 http://blog.chinaunix.net/uid-22145625-id-1789493.html


参考

gcc include路径 gcc中include文件的搜索路径 c项目中指定头文件目录