• 浅谈linux静态库、动态库。


    动态库又叫动态共享文件(.so,Dynamic Shared Objects)和静态库(.a)都是将一些待重用的公共代码打包成一种特殊的重定位目标文件。

    在使用时,连接器会将静态库中所有的代码,编译到可执行文件中。动态库有链接时动态库和运行时库之分。链接时,连接器会查找出使用的库中函数以及变量,在可执行文件中定向位置。可执行文件运行时,还需要根据文件中信息,在环境变量中去查找对应的库和对应的符号。

    1、静态库和动态库度的区别?

    静态库在使用的时侯会将所有代码直接拷贝到可执行文件中,在运行时可执行文件和静态库没有关联。但最后生成的执行文件较大,并且如果有多个执行文件使用了同一个静态库,在运行时内存中会有多份相同的代码。而且在链接时有较多度的处理,导致链接时的速度较慢。

    动态库没有将代码编译进执行文件,只是在编译时向执行文件中添加了用到的符号的信息。生成的执行文件相对较小,在运行时,执行该文件首先会在内存中查找或者在文件系统加载用到的动态库。动态库的使用一般都是共享的,多个进程使用同一个动态库中的代码。使用动态库的优点是生成的执行文件较小,占用内存也较小,编译速度相对来说较快。缺点是部署时必须确认环境。

    动态库还有一种dlopen(3)打开库的使用方式,通常成为显示调用,而链接方式通常称为隐式调用。首先通过dlopen(filename,flags) 打开动态库,返回动态库标识符,然后使用dlsym(3)[void *dlsym(void *handle, const char *symbol);]获得函数指针。关闭动态库调用使用dlclose();输出错误并清除errno使用dlerror();

    2、linux下有哪些调试库信息的命令。

    静态库本身被编译进执行文件,文件中包含所有运行时需要度符号和实现,不会报symbol缺失。

    查看库文件本身信息可以用readelf。

    查看当前执行文件依赖的动态库信息可以使用readelf -d。

    查看执行文件的symbol信息使用nm命令。

    查看执行文件依赖的共享文件的名称和位置使用ldd命令。

    3、编译静态库和动态库的选项。

    linux编译静态库命令为ar

    gcc/g++编译动态库命令为-shared

    4、一些问题。

    a:如果动态库使用c++实现,那么使用dlopen打开动态库后,有可能无法根据函数名称获得其在内存中的偏移量。这是因为c++符号信息与c有很多不同,编译时g++会给符号添加许多信息来区别标识符重载、不同命名空间等,dlsym获取不到正确信息是正常的。解决办法是使用[extern "C"]方式将c++符号导出为c符号。

    b:动态库编译时使用-fPIC的原因 见https://www.cnblogs.com/cswuyg/p/3830703.html

    未完待续......

  • 相关阅读:
    Kafka Producer 的缓冲池机制【转】
    【转】kafka如何实现每秒几十万的高并发写入?
    【转】zk和eureka的区别(CAP原则)
    【转】10倍请求压力来袭,你的系统会被击垮吗?
    (转发)深度学习模型压缩与加速理论与实战(一):模型剪枝
    Time Lens: Event-based Video Frame Interpolation
    PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
    Self-Supervised Learning with Swin Transformers
    DashNet: A Hybrid Artificial and Spiking Neural Network for High-speed Object Tracking
    KAIST Multispectral Pedestrian Detection Benchmark
  • 原文地址:https://www.cnblogs.com/xiangleili/p/8151441.html
Copyright © 2020-2023  润新知