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.编译时的-L选项是否影响LD_LIBRARY_PATH的值?

举一个实例:
当前文件夹结构如下:
test.c tools/
tool下有tool.c tool.h my_err.h 以及由此生成的libtool.so
tool下编译生成库文件
gcc -Wall -g -shared -o tool.so tool.c

在当前文件夹引用:
gcc -Wall -g –o  test.c -Ltools -ltool
编译不报错,但是运行加载的时候就出现cannot open shared object file。
如果将该库文件拷贝到/usr/lib下就没有错误,正常运行。

说明编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux链接动态是指在程序运行时动态加载文件,而不是在编译时将文件静态链接到可执行文件中。动态可以被多个程序共享,减少了内存的占用,提高了程序的运行效率。在Linux系统中,动态的文件名通常以.so结尾。程序在运行时需要动态时,会在系统中查找相应的文件并加载。动态使用可以提高程序的可维护性和可扩展性,是Linux系统中常用的一种技术。 ### 回答2: 在Linux系统中,链接动态是将可执行文件与动态文件(.so文件)关联起来的过程。动态是包含一组已编译函数的文件,可以被多个程序共享使用,以减少程序的体积和提高运行效率。 在Linux下,链接动态有两种方式:隐式链接和显式链接。 隐式链接是在编译源代码时,在编译命令中添加-l选项,指定要链接的动态名称,编译器会自动在系统目录中查找并链接对应的动态。例如,编译命令为: gcc -o test test.c -lm 其中,-lm表示要链接数学libm.so。隐式链接的优点是方便,无需手动指定动态的路径,编译器会自动搜索。 显式链接是在程序运行时,通过调用特定的函数来链接动态。首先,使用dlopen函数打开动态文件,获取一个句柄;然后,使用dlsym函数根据函数名获取动态中的符号;最后,使用dlclose函数关闭句柄。这种方式更加灵活,可以在程序运行时动态地加载和卸载动态,并使用其中的函数。 对于动态的路径问题,可以使用-L选项指定文件的搜索路径。例如,编译命令为: gcc -o test test.c -L/path/to/library -lmylib 其中,-L/path/to/library表示动态所在的路径,-lmylib表示要链接的动态名称。如果动态在默认的系统目录中,可以省略-L选项。 总结一下,Linux链接动态的方式有隐式链接和显式链接两种,根据需求选择不同的方式。隐式链接通过在编译命令中添加-l选项,自动链接系统目录中的动态;显式链接使用dlopen、dlsym和dlclose函数,在程序运行时动态加载和卸载动态。 ### 回答3: 在Linux中,链接动态是将程序运行所需的动态文件与程序本身进行关联的过程。在Linux中,动态文件通常以.so为后缀名。 要链接一个动态,首先需要使用编译器的选项来指定动态的路径和名称。一般来说,可以使用-l选项来指定要链接的文件,例如使用-lm来链接数学。同时,还要使用-L选项来指定文件的搜索路径,以确保编译器能够找到文件。 例如,假设有一个包含以下代码的程序文件main.c: ```c #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } ``` 如果想要链接数学libm.so,可以在命令行中执行以下命令进行编译和链接: ``` gcc main.c -o main -lm ``` 这条命令中,gcc是编译器,main.c是源代码文件,-o main指定生成可执行文件的名称为main,-lm指定链接数学libm.so。 在链接完成后,可以使用ldd命令来查看程序所依赖的动态,例如执行以下命令: ``` ldd main ``` ldd命令的输出将显示出程序所依赖的动态文件的路径。 总结来说,链接动态的过程就是在编译和链接时指定文件的路径和名称,确保编译器能够找到所需的动态文件。然后,在运行时,程序会在指定的文件路径中查找并加载所需的动态

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值