精华内容
下载资源
问答
  • linux 动态静态路径

    千次阅读 2018-12-26 14:22:27
    一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。...

    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指定查找路径

    转自:https://blog.csdn.net/hktkfly6/article/details/61922685/

    展开全文
  •  库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序...一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处...

    原文地址:http://blog.csdn.net/jaylong35/article/details/6132087


            库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 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指定查找路径。

    展开全文
  • 1. 连接和运行时库文件搜索路径设置  库文件在连接(静态库和共享库)和运行(仅限于使用共享库...一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进

    【来源】http://www.cnblogs.com/pang1567/p/3678083.html

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


            库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用: 
        (1). 在 /etc/ld.so.conf 文件中添加库的搜索路径。(或者在/etc/ld.so.conf.d 下新建一个.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 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。 
             这种设置方式需要 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. 如何使用动态库


            如果程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。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指定查找路径。

    展开全文
  • g++/gcc 连接 so动态库或者 .a静态库时,需要设置这些动态库的路径, 例如: g++ -o main main.cpp -L./lib -ldymamic -lpthread -lrt 这些是设置到哪个目录下去查找关联的动态库。 如果在-L目录下面找不到...

    g++/gcc 连接 so动态库或者 .a静态库时,需要设置这些动态库的路径, 例如:


    g++ -o main main.cpp -L./lib -ldymamic -lpthread -lrt  这些是设置到哪个目录下去查找关联的动态库。 如果在-L目录下面找不到相应的动态库,就会到 LD_LIBRARY_PATH 的目录下去找,如果还找不到,就会到/usr/lib 目录下去找。


    而如果要关联静态库,例如: g++ -o main main.cpp -L./lib -ldymamic ./lib/libstatic.a 。 请注意这个静态库的路径。 对于静态库,是需要详细标明这个静态库的路径的, 因为-L后面设置的路径,对于静态库来说是无效的。


    现在谈另外一个问题:

    g++ -o main main.cpp -L./lib -ldymamic -lpthread -lrt 编译成功后, ./main 运行程序会报错, 提示找不到 libdymamic.so动态库。 因为使用这种方式,需要额外的设置:

     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib ,之后运行main就可以正常运行了。

    当然,你也可以直接这样写:

    g++ -o main main.cpp /home/****/libdynamic.so -lpthread -lrt , 直接写动态库的绝对路径。 这样就不需要设置LD_LIBRARY_PATH。 但这样有一个缺陷: 这个so必须放在绝对路径下,不能放到其他地方。 这种写法很不好,不提倡。


    动态库搜索路径分两种,一种是链接时候的搜索路径,一种是运行时期的搜索路径。像前面提到的 -L./lib 是属于链接时期的搜索路径,即给ld程序提供的编译链接时候寻找动态库路径;而 LD_LIBRARY_PATH则既属于链接期搜索路径,又属于运行时期的搜索路径。

    展开全文
  • gcc怎么设置默认的include,lib路径

    千次阅读 2012-07-09 08:56:52
    gcc怎么设置默认的include,lib路径 gcc怎么设置默认的include,lib路径 《GCC:the complete referrence》说,gcc的include有以下几个组成: 1./usr/local/include 2./usr/lib/gcc-lib/i386-redhat-linux/3.2.2...
  • Linux制作静态链接库

    千次阅读 2016-07-22 17:38:49
    Linux静态库文件名组成: 前缀lib、库名和后缀.a组成(‘lib*.a’)。 静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间,当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于...
  • linux下的搜索路径设置

    千次阅读 2019-04-05 11:06:10
    除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径( 也可以在编译命令中通过 -I来指定): #C export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH # ...
  • Linux使用静态库和动态库

    千次阅读 2016-05-08 16:28:07
    Linux使用静态库和动态库
  • 路径问题!路径问题!路径问题! 这个问题坑我两次了,这次必须整理一下。杜绝在此入坑,也祝各位码农们出坑...3、静态文件路径配置(包括java后端读取文件路径) 走: 一、相对路径和绝对路径(简单一说) 绝...
  • Linux动态库路径设置

    2012-08-24 23:19:41
    众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的...
  • Linux cmake 静态链接boost库

    千次阅读 2018-06-05 16:59:54
    本文介绍如何在Linux 环境下使用cmake 静态链接Boost 库。 示例 我们将编译好boost静态库.a 文件和头文件放入third_party 目录,在CMakeLists.txt 中使用find_package 方法查找boost静态库。 我自己在Cen...
  • LD_LIBRARY_PATH是Linux系统下的环境变量名,类似于Path(设置可执行文件的搜索路径)。 作用:用于指定查找共享库(动态链接库)时除了默认路径(./lib和./usr/lib)之外的其他路径。 使用情形:移植程序时的经常...
  • Linux静态编译Qt

    千次阅读 2011-05-05 11:01:00
    Linux静态编译Qt
  • 设置linux gcc搜索路径

    千次阅读 2012-03-16 22:42:35
    对所有用户有效修改/etc/profile...#在PATH中找到可执行文件程序的路径。 export PATH =$PATH:$HOME/bin #gcc找到头文件的路径 C_INCLUDE_PATH=/usr/include/libxml2:/MyLib export C_INCLUDE_PATH #g++找到头
  • 1.什么是库文件? 保存函数和变量 特点:保存的函数与变量只能使用但不能看到其实现 2.Linux库文件 静态库:在编译阶段加载(将库文件的代码加载到...4.Linux库文件存放路径(自动搜索路径) /lib:存放系统运行所
  • Linux静态库编译

    千次阅读 2013-10-11 12:04:41
    Linux下动态库文件的扩展名为".so"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。这样,线程函数库被称作libthread.so。静态库的文件名形式是libname.a。共享...
  • Linux程序的安装路径

    千次阅读 2018-09-10 17:56:59
    无论Windows还是Linux,安装软件实质是复制一些列文件到磁盘中。这些文件包括动态和静态库...Linux中,添加了默认的库、程序、头文件的搜索路径,我们也可以自定义这些搜索路径。 安装程序的实质是复制文件到磁盘...
  • 生成静态库  若当前已有以下.o文件: obj1.o obj2.o  则gcc指令如下: ... ~$ ar -rsv libtest.a obj1.o obj2.o ... 注:linux下生成静态库.a文件有一个命名规则,必须 lib 开头 .a 结尾, 即
  • linux下生成lib库zzz

    千次阅读 2012-05-23 15:42:18
    1、linux库文件分为静态库和动态库两种。静态库习惯以.a 结尾,而动态库习惯以.so(shared object)结尾。而且必须以lib开头。 2、静态库的原则是“以空间换时间”,增加程序体积,减少运行时间; 生成:在编译...
  • Linux Cmake静态库链接

    万次阅读 2017-11-07 14:06:21
    静态库和动态库使用的区别:其中.a文件是静态链接库文件,静态库名称一般为xxx.a,在编译时和应用程序链接在一起,这样的应用程序占用空间较大,但是可以在任意台电脑上使用,而不必担心电脑上是否有库的存在。...
  • 1.什么是库 在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,... linux下的库有两种:静态库和共享库(动态库)。动态通常用.so为后缀,静态用.a为后缀。例如:libhello...
  • Linux静态编译与动态编译

    千次阅读 2019-01-24 18:50:14
    二、Linux下的静态库和静态编译 静态函数库一般扩展名为(.a),这类的函数库通常扩展名为 libxxx.a 。这类函数库在编译的时候会直接整合到程序中,所以利用静态函数库编译成的文件会比较 大 ,这类函数库最大的...
  • Linux INCLUDE与LIB环境变量

    千次阅读 2015-05-06 20:08:09
    对所有用户有效请修改/etc/profile, 只对当前用户有效请修改当前...#可执行文件路径。 export PATH =$PATH:$HOME/usr/bin #c头文件路径 C_INCLUDE_PATH=$HOME/usr/include export C_INCLUDE_PATH #c++头文件路径 CPL
  • 文章目录一、库什么是库?二、静态库什么是静态库?静态库的创建与使用三、共享库什么是共享库?共享库的创建和使用四、静态库与共享库的区别 ...分为两种形式:静态库(.a .lib)和共享库也称动态...
  • linux下的lib文件

    万次阅读 2010-09-23 16:08:00
    随着Linux性能的不断提升和逐渐普及,会有越来越多的人在Linux下从事应用软件的开发。这里笔者根据从事Linux应用程序开发的经验,介绍Linux编程库使用的一些基础知识。 <br /> 库的定义和种类 <br /> ...
  • Linux_静态库与动态库的制作与使用

    千次阅读 2021-04-17 10:14:54
    什么是库 本质上来说库是一种可执行的二进制代码 (但不可以独立执行), 可以被操作系统载入内存执行. 由于windows 和linux 的平台不同 (主要是编译器、... linux 下的库有两种: 静态库和共享库 (动态库). 静态库 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,677
精华内容 23,470
关键字:

linux设置静态lib的路径

linux 订阅