1.头文件搜索顺序:

  • ①先搜索当前目录
    ②然后搜索-I指定的目录
    ③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
    ④最后搜索gcc的内定目录
    /usr/include
    /usr/local/include
    /usr/lib/gcc/x86_64-redhat-Linux/4.1.1/include

2.库文件搜索顺序:

  • 编译的时候:
    ①gcc会去找-L
    ②再找gcc的环境变量LIBRARY_PATH
    ③再找内定目录 /lib /usr/lib /usr/local/lib
    运行时动态库的搜索路径:
    动态库的搜索路径搜索的先后顺序是:
    ①编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,“指定。当指定多个动态库搜索路径时,路径之间用冒号”:“分隔)
    ②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:"分隔)
    ③配置文件/etc/ld.so.conf中指定的动态库搜索路径;
    ④默认的动态库搜索路径/lib;
    ⑤默认的动态库搜索路径/usr/lib。
    (应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录)
    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。

3. include路径添加:

  • 除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:
C
  • export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
CPP
  • export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH 以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。

4. Link链接库文件路径:

  • 链接库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的(也可以在编译命令中通过 -l -L 来指定,这里讲的是使用系统默认搜索路径)。
    一般 Linux 系统把 /lib /usr/lib /usr/local/lib 作为默认的库搜索路径,所以使用这几个目录中的链接库文件可直接被搜索到(不需要专门指定链接库路径)。对于默认搜索路径之外的库,则需要将其所在路径添加到gcc/g++的搜索路径之中。
    链接库文件的搜索路径指定有两种方式:1)修改/etc/so.ld.conf 2)修改环境变量,在其中添加自己的路径
1) 修改环境变量
  • 动态链接库搜索路径:
    export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
  • 静态链接库搜索路径:
    export LIBRARY_PATH=XXX:$LIBRARY_PATH
  • 以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。
2) 修改/etc/so.ld.conf
  • 在/etc/ld.so.conf 中添加指定的链接库搜索路径(需要root权限),然后运行 /sbin/ldconfig,以达到刷新 /etc/ld.so.cache的效果,这一步很重要。
  • LD_LIBRARY_PATH和LIBRARY_PATH区别,LD_LIBRARY_PATH用于运行时动态库的查询路径,而LIBRARY_PATH是用于编译时的查找路径。一个是运行时,一个是编译时。