linux下C/C++编译时系统搜索 include 和 连接库 文件路径的指定

 

 C/C++程序在linux下被编译和链接时,GCC/G++会查找系统默认的include和link的路径,以及本身在编译命令中指定的路径。本身指定的路径就不说了,这里说明一下系统自动搜索的路径。
 
【1】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中添加(针对某个用户生效),修改完后从新登陆即生效。
 
【2】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/ld.so.conf 中添加指定的连接库搜索路径(须要root权限),而后运行 /sbin/ldconfig,以达到刷新 /etc/ld.so.cache的效果。
    
    以上两种方式都可以达到指定连接库搜索路径的效果。
    
    第二种搜索路径的设置方式对于程序链接时的库(包括共享库和静态库) 的定位已经足够了,可是对于使用了共享库的程序的执行仍是不够的。这是由于为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,系统会直接读取 /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中,否则修改的内容就等于没有生效。
    在程序链接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式以外,还能够经过 -L 和 -l 参数显式指定。由于用 -L 设置的路径将被优先搜索,因此在链接的时候一般都会以这种方式直接指定要链接的库的路径。
 
注意:
    1)在配置环境变量的时候,等号前面不要加空格,不然可能出现 command not found
    2)修改/etc/ld.so.conf后,当系统从新启动后,全部基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。因为 GTK+ 版本的改变,有时会给应用程序带来兼容性的问题,形成某些程序运行不正常。为了不出现这些状况,在 GTK+ 及其依赖库的安装过程当中对于库的搜索路径的设置将采用环境变量的方式     export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
相关文章
相关标签/搜索