Linux下动态库使用小结

转自:https://blog.csdn.net/jaylong35/article/details/6132087

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

相关文章
相关标签/搜索