zoukankan      html  css  js  c++  java
  • Linux 静态库和动态库 使用说明

        Linux下程序运行中,有两种库,静态库和动态库。

        静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改变,程序需要重新编译。

        动态库:名字一般为libxxx.M.N.so,M为主版本号,N为副版本号。优点是运行时,有需要时才动态调用外部库中的函数,节省空间,缺点是运行环境中必须提供相应的库,动态库更新升级方便。

      静态库的制作和使用

         image

    image

    动态库的制作和使用

    动态库的后缀为.so,一般存放在/lib, /usr/lib等目录下,可以使用ldd工具来查看一个可执行程序使用了哪些动态库,见下图:

    image

    可以看到,我们常用的ls命令使用的动态库位于/lib/i386-linux-gnu/目录下。

    动态链接是由操作系统运行程序时调用的,既然是程序,那按照Linux的风格,肯定有对于的配置文件来设置,动态链接库的配置文件位于/etc/ld.so.conf,具体内容如下:

    image

    从上图可以知道,系统搜索动态链接库的路径位于特定的目录。Linux系统为了提高动态链接库的运行性能,把一些常用的动态链接库放在/etc/ld.so.cache这个文件中去。如何更新这个动态链接库的缓存文件呢?Linux提供了ldconfig命令来更新,这个命令主要搜索/lib和/usr/lib以及配置文件ld.so.conf.d/目录下的可用的动态链接库文件,然后重新创建新的动态链接程序/lib/ld-linux.so.2所需的连接和更新动态链接库缓存文件ld.so.cache.

       ldconfig –p | head or grep XX : 查看系统中有哪些动态链接库

       ldconfig –v 输出动态链接库扫描目录并且刷新ld.so.cache缓存

       执行ldconfig需要root权限

       既然是动态链接库,那就是需要开发出来给其他人使用的。按照C语言的风格,h头文件提供函数库的接口说明,就像stdio.h头文件一样,我们用到的输入输出,都必须包含这个头文件。要使用我们自己的动态链接库,那就要包含动态链接库提供的头文件。

    image

    然后是编译生成动态链接库

       image

    使用动态链接库

      image

    如果是在团队开发过程中,建议将动态链接库放在/lib或则/usr/lib,或者自定义的/usr/local/lib/目录下,然后将库路径添加到自己库的配置文件mytest.conf,将此配置文件拷贝到/etc/ld.so.conf.d/目录下,执行ldconfig就可以。

      动态链接库的动态加载方式

        Linux提供了一套API用于动态加载动态链接库,更加灵活的使用动态链接库,详细代码和注释如下:

    image 

    编译后执行:

    image

    注意事项:

            在使用动态执行动态链接库时,可执行程序需要添加 dlfcn.h头文件

            在编译时,需要增加 –rdynamic –ldl 这两个参数,产生可以调用动态链接库的执行代码。

    Technorati 标签:

     

    参考链接:

    http://blog.chinaunix.net/uid-23069658-id-3142046.html

  • 相关阅读:
    kettle连接MySQL报错
    git切换到某个tag, 从tag切换回当前分支
    wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
    linux下python3.6.7安装
    haproxy backup模式
    Oracle_2 随便写写
    Oracle 日期函数练习 随便写写
    RabbitMQ
    X.509标准、CA认证
    docker-compose和Dockerfile的volumes
  • 原文地址:https://www.cnblogs.com/cherishui/p/4236555.html
Copyright © 2011-2022 走看看