头文件

#include “headfile.h”

搜索顺序为:

  1. 先搜索当前目录
  2. 然后搜索-I指定的目录
  3. 再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C语言使用的是C_INCLUDE_PATH,Object-C文件是OBJC_INCLUDE_PATH
  4. 最后搜索gcc的内定目录,一般会包含下面这些目录:

/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include

如果C++,还会有

libdir/../include/c++/version

libdirtargetversion都可以通过gcc -v知道

各目录存在相同文件时,先找到哪个使用哪个。

也可以通过以下命令来获取到gcc内定目录

C++:`gcc -print-prog-name=cc1plus` -v
C: `gcc -print-prog-name=cc1` -v

#include <headfile.h>

这种包含系统头文件的情况不会搜索当前目前,其他和上面都是一样的

静态库文件

编译的时候:

  1. gcc会去找-L指定的目录
  2. 再找gcc的环境变量LIBRARY_PATH
  3. 再找内定目录 /lib,/usr/lib,/usr/local/lib 这是当初compile gcc时写在程序内的(这应该是不可配置的)

运行时动态库

动态库的搜索路径搜索的先后顺序是:

  1. 编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  4. 默认的动态库搜索路径/lib;
  5. 默认的动态库搜索路径/usr/lib。

应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录