• linux下gcc默认搜索头文件及库文件的路径


    一、头文件
    gcc 在编译时如何去寻找所需要的头文件:
    ※所以header file的搜寻会从-I开始
    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
    ※再找内定目录
    /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
    库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是
    /usr/include
    prefix/include
    prefix/xxx-xxx-xxx-gnulibc/include
    prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
    二、库文件
    cos()等函式库的选项要多加 -lm
    编译的时候:
    ※gcc会去找-L
    ※再找gcc的环境变量LIBRARY_PATH
    ※再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
    三、运行时动态库的搜索路径
    1、在配置文件/etc/ld.so.conf中指定动态库搜索路径
    2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
    3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。
    这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
    4、默认的动态库搜索路径/lib
    5、默认的动态库搜索路径/usr/lib
    可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,
    再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,
    如此往复,将可得到Linux搜索动态库的先后顺序。
    程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示
    程序pos输出结果使用的动态库对应的动态库搜索路径指定方式
    。/ ./libpos.so 编译目标代码时指定的动态库搜索路径
    /root/test/env/lib /root/test/env/lib/libpos.so环境变量LD_LIBRARY_PATH指定的动态库搜索路径
    /root/test/conf/lib /root/test/conf/lib/libpos.so配置文件/etc/ld.so.conf中指定的动态库搜索路径
    /lib /lib/libpos.so 默认的动态库搜索路径/lib
    /usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib
    综合以上结果可知,动态库的搜索路径搜索的先后顺序是:
    1.编译目标代码时指定的动态库搜索路径;
    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
    4.默认的动态库搜索路径/lib;
    5.默认的动态库搜索路径/usr/lib.

    LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:

    LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。

    LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。

    区别与使用:

    开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。

    发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。


    开发时设置LIBRARY_PATH动态链接库,以便gcc能够找到,
    release时设置LD_LIBRARY_PATH以便程序加载时能够自动找到

    gcc -L 自定义 lib路径

    vim /etc/profile或者vim /etc/bashrc追家如下一行
    export LIBRARY_PATH=/usr/local/lib/gliethttp_lib1:/usr/local/lib/gliethttp_lib2:$LIBRARY_PATH
    加入上面一行保证gcc时能够找到库,等效于gcc -L/usr/local/lib/gliethttp_lib1 -L/usr/local/lib/gliethttp_lib2


    4、gcc默认动态库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib等。
    

     2)添加库文件路径:
    LIBRARY_PATH    #used by gcc before compilation to search for directories containing libraries that need to be linked to your program.
    LD_LIBRARY_PATH    #used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

    例如:
    MATLAB=/opt/MATLAB/R2012a
    export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnxa64
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

    题外话,顺便提一下LIBRARY_PATH和LD_LIBRARY_PATH的区别:
    我们知道Linux下有2种库:static libraries和shared libraries。如(这里)阐述的,静态库是在编译期间会被链接并拷贝到你的程序中,因此运行时不再需要该静态库。动态库在编译时并不会被拷贝到你的程序中,而是在程序运行时才被载入,因此在程序运行时还需要动态库存在,这时就会用到LD_LIBRARY_PATH指定的路径去查找这个动态库。The libraries can be static or shared. If it is static then the code is copied over into your program and you don't need to search for the library after your program is compiled and linked. If your library is shared then it needs to be dynamically linked to your program and that's when LD_LIBRARY_PATH comes into play.

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

    对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
    .bashrc或.bash_profile里增加下面的内容:
    (注意:等号前面不要加空格,否则可能出现 command not found)

    #在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

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

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


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

    在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。

    在 /etc/ld.so.conf 文件中添加库的搜索路径。

    将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择

    添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:

    /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下的,也是不会被使用 的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。

    在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。

    前 面已经说明过了,库搜索路径的设置有两种方式:在环境变量 LD_LIBRARY_PATH 中设置以及在 /etc/ld.so.conf 文件中设置。其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+ 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行。这种设置方式不需要 root 权限,设置也简单:

    $ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

    可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:

    $ echo $LD_LIBRARY_PATH

    至此,库的两种设置就完成了。

  • 相关阅读:
    使用hibernate利用实体类生成表和利用表生成实体类
    多线程循环打印ABC
    maven在整合springmvc+hibernate运行时遇到的一些问题
    checkbox属性获取
    glib中关于线程池的一个实例
    阅读英文文献总结的专业词汇
    网络流分类领域牛人
    锐捷s3550千兆交换机配置端口镜像
    转载Wireshark过滤语法
    DispatcherServlet处理流程
  • 原文地址:https://www.cnblogs.com/youxin/p/5357614.html
Copyright © 2020-2023  润新知