zoukankan      html  css  js  c++  java
  • Linux C/C++编程之(十)动态库的制作和使用

    一、概述

    在这里插入图片描述

    二、动态库的优缺点

    机制:

    • 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

    优点:

    • 节省内存(共享)
    • 易于更新(动态链接)
      • 停止运行程序
      • 使用新库覆盖旧库(保证新旧库名称一致,接口一致)
      • 重新启动程序

    缺点:

    • 延时绑定,速度略慢

    使用场合:

    • 对速度要求不是很强烈的地方都应使用动态库

    注意事项:

    • 动态库是否加载到内存,取决于程序是否运行

    命名格式:

    1. lib开头
    2. 动态库名
    3. .so结尾

    三、动态库的制作

    (1)制作步骤

    1)生成“与位置无关“的目标文件。

    gcc -fPlC a.c b.c c.c -c
    
    • 参数:-PIC 表示生成与位置无关代码
    • 执行完毕后生成一系列的 .o 文件

    2)制作动态库

    gcc -shared -o libmytest.so a.o b.o c.o
    
    • 参数:-shared 制作动态库
    • -o:重命名生成的新文件

    3)使用动态库

    gcc main.c -L ./ -Imytest -I / -o app
    
    • -L–>指定库所在的路径
    • 去掉前缀 lib
    • 去掉后缀 .so
    • 只留下中间部分
    • -I–>头文件目录位置

    /.app–>运行失败

    • 查看依赖的共享库:ldd app 发现 libmytest 找不到
    • 没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径
    • 解决方案
      1. 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效
      2. 永久设置:将上条写入家目录下 .bashrc 文件中
      3. 粗暴设置:直接将 libmytest.so 文件拷贝到 /usr/lib/【/lib】目录下。(受 libc 库的启发)
      4. 将 libmytest.so 所在绝对路径追加入到 /etc/ld.so.con 文件,使用 sudo ldconfig-v 更新

    (2)实际操作

    • 生成 .o 目标文件,文件路径和内容同上,进入到 src 目录,生成 .o 目标文件:
      在这里插入图片描述
    • 将 .o 文件打包生成动态库
      在这里插入图片描述
    • 使用生成的动态库,-L 指定动态库路径 -l 指定库名
    gcc main.c -o main -I include/ -L ./lib -lCalc
    
    • 退出到 dongtai 目录下,将动态库拷贝到 lib 目录下并编译 main.c 并执行 main:
      在这里插入图片描述
      无法找到动态库目标文件,解决方法有三个:

    (1)拷贝到 /lib 下(不允许,容易与别人库命名重合)
    在这里插入图片描述
    (2)将库路径增加到环境变量 LD_LIBRARY_PATH 中(不是特别推荐)
    在这里插入图片描述
    (3)配置 /etc/ld.so.conf 文件,增加 /home/linux/dongtai/lib/ 路径,执行 ldconfig -v,并执行 main
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、动态库

    在这里插入图片描述

  • 相关阅读:
    删除MFC单文档默认菜单栏的两种方法
    mfc更改背景色
    (转)VC单选按钮控件(Radio Button)用法
    转:MFC 基于对话的程序界面显示完全后立即执行一个函数
    转:vc6以上如何给MFC对话框添加OnInitDialog函数
    常用网址
    2010年春季学期C语言程序设计答疑安排
    rdlc导出Excel
    SQL Server查询表的结构
    C# WinForm开发系列 WebBrowser
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302540.html
Copyright © 2011-2022 走看看