一、在相关配置文件中添加可执行文件/头文件/静态库/动态库的搜索路径

对所有用户有效在/etc/profile添加。

只对当前用户有效在Home目录下的.bashrc或.bash_profile里添加。

#在PATH中找到可执行文件程序的路径。
export PATH=$PATH:$HOME/bin

#gcc找到头文件的路径
C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
export C_INCLUDE_PATH

#g++找到头文件的路径
CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
export CPLUS_INCLUDE_PATH

#找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
export LIBRARY_PATH

#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
export LD_LIBRARY_PATH

 

二、文件路径的搜索顺序

头文件的搜索顺序
gcc 在编译时寻找所需要的头文件:
1、搜寻会从-I开始
2、然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3、再找内定目录

/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/i386-linux/include



库文件的搜索顺序
编译的时候:
1、gcc会去找-L
2、再找gcc的环境变量LIBRARY_PATH
3、再找内定目录 /lib:/usr/lib: /usr/local/lib:这是当初compile gcc时写在程序内的。
但是如果装gcc的时候,是有给定的prefix的话,那么就是

/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include



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

三、库文件两种搜索路径设置方式的区别

库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径;
在 /etc/ld.so.conf 文件中添加库的搜索路径。

将库文件路径添加到/etc/ld.so.conf的方法,就是将库文件的绝对路径直接写进去,一行一个。例如:

/usr/X11R6/lib
/usr/local/lib
/opt/lib

需要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库) 的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率, 所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的。

 

参考文献

1、Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

2、GCC相关的环境变量

3、ld.so(8) - Linux man page

4、Ubuntu:Environment Variables

5、linux-gcc 编译时头文件和库文件搜索路径