`
com1com4
  • 浏览: 162156 次
  • 性别: 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静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    linux 动态库静态库

    在Linux系统中,动态库(Dynamic Library)和静态库(Static Library)是程序开发中不可或缺的部分,它们提供了代码复用和模块化的功能。本篇文章将深入探讨这两种库的创建、使用以及它们之间的区别。 首先,我们来...

    linux静态库与动态库

    在Linux操作系统中,库文件是...总之,理解Linux下的静态库和动态库以及如何生成和使用它们对于进行系统级编程和软件开发至关重要。选择静态库或动态库取决于需求,如资源限制、程序部署的便捷性以及库更新的需求等。

    Linux静态库和动态库

    ### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...

    linux静态库及动态库创建及使用

    ### Linux静态库及动态库创建及使用 #### 一、基本概念 ##### 1.1 什么是库 在计算机编程领域,**库**(Library)是一系列预编译的代码集合,这些代码通常实现了某些功能或服务,可供其他程序在运行时调用。库可以...

    boost库1.68版本Linux下编译的动态库和静态库

    6. **使用编译好的库**:在项目中使用编译的Boost库时,需要链接对应的动态库(如`-lboost_thread -lboost_system`)或者静态库,并确保库的路径被系统搜索路径(`LD_LIBRARY_PATH`或`DYLD_LIBRARY_PATH`)包含。...

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

    这些是Linux下静态库和动态库的基本操作和概念,理解它们对于进行Linux系统开发和维护至关重要。在实际工作中,开发者需要根据项目需求和资源限制选择合适的库类型,并妥善处理库的路径和依赖问题。

    [转]在Linux中创建静态库.a和动态库.so

    在Linux系统中,开发软件时经常需要使用到库文件,它们分为静态库(.a)和动态库(.so)。本文将详细介绍如何在Linux环境中创建这两种类型的库,并探讨它们的区别和使用场景。 首先,让我们理解静态库和动态库的...

    cximage静态库 动态库 64位linux版本

    本篇文章将深入探讨cximage库的静态库和动态库版本,以及如何在64位Linux系统中编译和使用它们。 首先,让我们理解什么是cximage库。cximage是一个强大的C++类库,用于处理图像文件,支持多种格式如BMP, JPEG, PNG,...

    在Linux中创建静态库和动态库

    通过上述步骤,我们不仅了解了如何在Linux环境中创建和使用静态库与动态库,还学习了它们之间的主要区别: - **静态库**:在编译时会被链接到最终的可执行文件中,因此一旦程序被编译完成,就不需要依赖外部的库...

    Linux静态库和动态库学习总结

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下开发软件时,经常需要使用到库文件来实现复杂的功能。这些库文件可以分为两大类:静态库(static libraries)和动态库(dynamic libraries)。本文将详细介绍...

    linux静态库和动态库分析

    本文主要探讨的是Linux下的静态库和动态库。 首先,我们要了解什么是库。库本质上是一组预编译的函数和数据结构,以二进制形式存在,可供操作系统加载执行。由于Windows和Linux的系统架构差异,它们之间的库文件是...

    Linux编译动态库和静态库

    在Linux系统中,开发软件时常会遇到需要创建和使用动态库(.so)与静态库(.a)的情况。动态库允许多个程序共享同一份代码,节省内存资源,而静态库则将库代码直接编译进目标程序,不依赖外部环境。本篇将详细介绍在...

    Linux 如何使用gcc生成静态库和动态库

    Linux 使用 GCC 生成静态库和动态库 在 Linux 系统中,使用 GCC 编译器可以生成静态库和动态库。静态库和动态库是两种不同的库类型,它们的主要区别在于代码被载入的时间不同。 静态库是在编译时被载入到可执行...

    liunx静态库与动态库链接装载与库.zip

    在Linux下,可以使用`ar`工具创建和管理静态库,`gcc`编译器的`-l`选项用于链接库,`-L`选项指定库的搜索路径。对于动态库,可以使用`gcc`的`-shared`选项创建,`ldd`命令检查程序的动态库依赖,`ldconfig`管理系统...

    linux 静态库和动态库的编写

    在Linux系统中,静态库和动态库是程序员在开发软件时常常会遇到的两种库类型。它们各自有其特点和用途,对程序的构建和运行有着显著的影响。 **静态库**,通常以`.a`为扩展名,如`libxxx.a`。在编译过程中,静态库...

    linux pthread libc静态库

    使用这些静态库进行编译时,需要通过链接器(如`gcc`)指定库路径和库名。例如,如果静态库位于当前目录,可以使用以下命令来编译: ```bash gcc my_program.c -o my_program -L. -lpthread -lc ``` 在这个命令中...

    Linux静态库和动态库的制作和使用(ubuntu18.04)以及解决动态库加载失败问题

    总的来说,理解和熟练掌握Linux下的静态库和动态库的制作与使用对于开发和调试程序至关重要。同时,了解如何解决动态库加载失败的问题能帮助我们快速定位和解决问题,提高开发效率。通过实践和学习,你可以更加深入...

Global site tag (gtag.js) - Google Analytics