`
com1com4
  • 浏览: 157033 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]Linux 静态库与动态库搜索路径设置

阅读更多

1. 连接和运行时库文件搜索路径到设置

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

    (1). 在 /etc/ld.so.conf 文件中添加库的搜索路径。(或者在/etc/ld.so.conf.d 下新建一个.conf文件,将搜索路径一行一个加入-junziyang)

        将自己可能存放库文件的路径都加入到/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 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。

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

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

        设置方式:

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

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

            echo $LD_LIBRARY_PATH

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

2.交叉编译时候如何配置连接库的搜索路径

        交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib, /lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。

        首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候找到需要的库。

    (1)交叉编译时候直接使用-L和-I参数指定搜索非标准的库文档和头文档的路径。例如:

        arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include

    (2)使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。

    (3)使用如下命令:

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib

        参见《ld.so.conf 文档和PKG_CONFIG_PATH变量》这篇文章。

        通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(!)。

        通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。

        不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH 的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路 径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

    (4)交叉编译时使用软件的configure参数。例如我编译minigui-1.3.3,使用如下配置:

        #!/bin/bash

        rm -f config.cache config.status

        ./configure --build=i686-linux --host=arm-linux --target=arm-linux \

        CFLAGS=-I/usr/local/arm/2.95.3/arm-linux/include \

        LDFLAGS=-L/usr/local/arm/2.95.3/arm-linux/lib \

        --prefix=/usr/local/arm/2.95.3/arm-linux \

        --enable-lite \

        --disable-galqvfb \

        --disable-qvfbial \

        --disable-vbfsupport \

        --disable-ttfsupport \

        --disable-type1support \

        --disable-imegb2312py \

        --enable-extfullgif \

        --enable-extskin \

        --disable-videoqvfb \

        --disable-videoecoslcd

        这里我配置了CFLAGS和LDFLAGS参数,这样一来,我就不用去修改每个Makefile里-L和-I参数了,也不用再去配置 LD_LIBRARY_PATH或改写ld.so.conf文档了。


Linux下动态库使用小结

1. 静态库和动态库的基本概念
        静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生 成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库 文件支持,如果机器里没有这些库文件就不能运行。

2. 如何使用动态库
        如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这 两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择 使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动 后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用 LD_LIBRARY_PATH》)。

        不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH 的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》)。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直 接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

3.库的链接 时路径和运行时路径
        现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式 移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过- rpath(或-R )、LD_LIBRARY_PATH指定查找路径。

分享到:
评论

相关推荐

    关于Linux静态库和动态库的分析

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。本文介绍了使用库的方法,分析了动态库的路径问题,介绍了查看库中的符号的方式。

    Linux静态库和动态库的制作

    1.什么是库文件? 保存函数和变量 特点:保存的函数与变量只能使用但不能看到其实现 2.Linux库文件 静态库:在编译阶段加载(将库文件的代码加载到...4.Linux库文件存放路径(自动搜索路径) /lib:存放系统运行所

    Linux下的库文件

    Linux下的库文件 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库。

    openssl-1.1.1g编译、交叉编译方式.rar

    linux下编译/交叉编译openssl-1.1.1g生成动态库和静态库方法: 一、编译linux版本 1. cp openssl-1.1.1g.tar.gz /opt/ 2. tar -zxvf openssl-1.1.1g.tar.gz 3. mkdir build 4. ./config --prefix=/opt/openssl-1.1.1...

    libstdc++.6.0.9静态依赖库

    library not found for -lstdc++.6.0.9 iOS12.0中全部采用libc++代替lstdc++的动态库。最简单解决该问题的方法就是从Xcode9.4中找到动态库lstdc++.6.0.9.tbd文件copy到Xcode10下就可以完美解决问题。或者用古老的...

    C版本MD5库

    C版本MD5库 参考README.md 内容 ...至于选静态库还是动态库,就看具体应用场景了,静态库的坏处是把库代码编译进去了, 若是程序按字节收费还是可以的,(PS,吐槽那个写了一个10w,10G的程序中国神童)

    LINUX安装与配置简明手册

    11.2.9 在Red Hat发行版本中设置静态路由 分配 138 11.2.10 为计算机配置域名解析 139 11.2.11 建立LAN 140 11.2.12 配置打印服务 141 11.2.13 在GUI中添加一台打印机 142 11.2.14 在GUI中修改一个打印机设置 144 ...

    linux网络编程-宋敬彬-part3

    2.3.5 搜索路径 43 2.3.6 自动推导规则 44 2.3.7 递归make 44 2.3.8 Makefile中的函数 46 2.4 用GDB调试程序 47 2.4.1 编译可调试程序 48 2.4.2 使用GDB调试程序 49 2.4.3 GDB常用命令 52 2.4.4 ...

    linux网络编程-宋敬彬-part2

    2.3.5 搜索路径 43 2.3.6 自动推导规则 44 2.3.7 递归make 44 2.3.8 Makefile中的函数 46 2.4 用GDB调试程序 47 2.4.1 编译可调试程序 48 2.4.2 使用GDB调试程序 49 2.4.3 GDB常用命令 52 2.4.4 ...

    linux安装与配置简明手册

    11.2.9 在Red Hat发行版本中设置静态路由 分配 138 11.2.10 为计算机配置域名解析 139 11.2.11 建立LAN 140 11.2.12 配置打印服务 141 11.2.13 在GUI中添加一台打印机 142 11.2.14 在GUI中修改一个打印机设置 ...

    linux网络编程-宋敬彬-part1

    2.3.5 搜索路径 43 2.3.6 自动推导规则 44 2.3.7 递归make 44 2.3.8 Makefile中的函数 46 2.4 用GDB调试程序 47 2.4.1 编译可调试程序 48 2.4.2 使用GDB调试程序 49 2.4.3 GDB常用命令 52 2.4.4 ...

    LASTools库、源代码和工程

    LASTools源代码组织成QtCreator工程(*.pro),已配置好编译路径和参数,可在QtCreator中直接进行编译,支持Windows和Linux下直接编译。包含编译好的LASlib静态库和LASzip动态库。

    dwg交叉编译库

    一直想解析CAD文件的dwg格式,从网上找到了libdwg的源码在Ubuntu上利用交叉编译工具编译生成的dwg的动态和静态库文件,里面也有dwg的头文件,将头文件添加到自己工程中,在.proz中再链接上里面的库 LIBS += -L/文件...

    Linux常用的命令。。。。。

    ln –s file1(绝对路径) file2(绝对路径) 可以为file1 跨目录连接到file2 ln file1 file2 为file1创建file3 的硬连接 同时删除file1 和file2 才能删除文件 分发系统: 1. 支持pxe client 功能,有pxe的网卡 ...

    curl-nss-http2-release-64.tar.gz

    ubuntu20.04 编译,包含静态库和动态库64位release版本, 解压后,需要把lib路径添加到/etc/ld.so.conf才可使用,ldconfig

    curl-nss-http2-debug-64.tar.gz

    ubuntu20.04 编译,包含静态库和动态库64位debug版本, 解压后,需要把lib路径添加到/etc/ld.so.conf才可使用,ldconfig

    易语言程序免安装版下载

    “库文件名”以.lib或.obj为后缀的将被视为静态库,可使用绝对路径或相对路径(相对当前源代码所在目录),如依赖多个静态库请分别列出并以逗号分隔;“在库中的对应命令名”请务必准确填写静态库中公开导出的符号...

    linux网路编程 中文 23M 版

    5搜索路径...................................................... 43 2 . 3 . 6自动推导规则.................................................. 44 2.3.7 递归 make.............................................

    log4cplus 源码(C++编写的开源的日志系统)

    把两个工程编译生成的库以及头文件所在目录放到你的工程的搜索路径中,如果你使用静态库,请在你的工程中 "project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。 ### 构成要素介绍 ### 虽然...

Global site tag (gtag.js) - Google Analytics