动态库和静态库

2023-05-16

概念

什么是库

库是写好的,现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常

本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a)和动态库(.so)。

所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:

静态库

之所以称为静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

静态库特点:

  • 静态库对函数库的链接是放在编译时期完成的。

  • 程序在运行时与函数库再无瓜葛,移植方便。

  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

动态库

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新

动态库特点:

  • 动态库把对一些库函数的链接载入推迟到程序运行的时期。

  • 可以实现进程之间的资源共享。(因此动态库也称为共享库)

  • 将一些程序升级变得简单。

  • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

例程

文件准备

hello.c

#include <stdio.h>

void say_hello(char *name)
{
	printf("Hello %s\n", name);
}

hello.h

#ifndef _HELLO_H
#define _HELLO_H

void say_hello(char *name);

#endif

main.c

#include "hello.h"

int main()
{
	say_hello("hualai");
	return 0;
}

静态库

  1. 将.c文件编译为.o文件,执行:gcc -c hello.c,生成hello.o文件。

  2. 使用ar命令将.o文件打包成静态库。静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为hello,则静态库文件名就是libhello.a。执行:ar -crv libhello.a hello.o,生成libhello.a文件。

  3. 执行:gcc main.c -o hello_Hualai -L. -lhello。注意,-L.是指在当前路径下查找静态库;-lhello是指链接libhello.a,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

  • 生成可执行文件hello_Hualai,8368字节,使用ldd hello_Hualai查看文件依赖库:
linux-vdso.so.1 (0x00007ffc987d6000)
	
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc917704000)
	
/lib64/ld-linux-x86-64.so.2 (0x00007fc917cf7000)

这里不会显示静态库的链接。

动态库

  1. 将.c文件编译为.so文件,执行:gcc -shared -fPIC hello.c -o libhello.so,生成libhello.so文件。-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。-shared是生成动态库的链接器选项。

  2. 将动态库移入系统库文件夹中,执行:sudo cp libhello.so /usr/lib/。如需指定路径,可声明环境变量,export LD_LIBRARY_PATH=

  3. 编译链接动态库的可执行文件,执行:gcc main.c -o hello_Hualai -lhello

  • 生成可执行文件hello_Hualai,8288字节,比静态库要小,使用ldd hello_Hualai查看文件依赖动态库,可以找到libhello.so的链接:
linux-vdso.so.1 (0x00007ffcb9104000)
	
libhello.so => /usr/lib/libhello.so (0x00007f9a903d1000)
	
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a8ffe0000)
	
/lib64/ld-linux-x86-64.so.2 (0x00007f9a907d5000)

PS.如果想查询动态库实现了哪些接口,可以使用对应工具链的nm工具:

nm xxx.so

如果回复:no symbol:
动态库(elf)有两个符号表,“.symtab”和“.dynsym”。“.dynsym”只保留“.symtab”中的全局符号(global symbols )。命令strip可以去掉elf文件中“.symtab”,但不会去掉“.dynsym”。故而可使用如下命令查看:

nm -D xxx.so
readelf --symbols xxx.so
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态库和静态库 的相关文章

  • Qt中三种定时器的触发方式

    定时器QTimer控件 定时器触发方式3种所需api资料 1 定时器事件 触发案例1 xff1a 定时器事件案例2 xff1a 同时启动多个定时器 2 定时器对象 触发案例3 xff1a 通过定时器对象 定时 3 静态成员函数 触发案例4
  • shell脚本语言(超全超详细)

    shell脚本语言 1 shell的概述2 脚本的调用形式打开终端时系统自动调用 xff1a etc profile 或 bashrc 3 shell语法初识3 1 定义以开头 xff1a bin bash3 2 单个 34 34 号代表注
  • post请求百度网址内容和访问本地springmvc工程controller

    1 xff0c 访问百度 import java io BufferedReader import java io InputStreamReader import java io PrintWriter import java net U
  • 音乐播放器mplayer的简单使用

    mplayer 1 mplayer的安装2 mplayer的键盘模式基本控制键 xff1a 3 Slave模式 xff1a 启动方法一 xff1a 在终端下敲命令来启动mplayerMplayer 在slave模式下常用的命令 xff1a
  • AJAX和CGI 技术的应用

    AJAX xff0c CGI 一 AJAX1 AJAX的概述AJAX局部更新网页流程图 xff1a 异步流程 xff1a 2 AJAX的通信过程2 1 创建xmlHttpRequest对象2 2 设置服务器响应的回调函数标准的XMLHttp
  • W25QXX使用教程

    W25QXX是华邦公司生产的一块FLASH储存芯片 那W25Q256为例 xff1a 驱动方式 xff1a 单路双路四路SPI QSPI xff1b 擦写周期 xff1a 10W次 支持电压 xff1a 2 7 3 6V 频率 xff1a
  • QT串口通信

    QT串口的使用 1 添加头文件2 串口通信的7个步骤3 发送接收数据 1 添加头文件 span class token macro property span class token directive keyword include sp
  • Qt存储图片到数据库&&从数据库读取图片

    使用Qt将图片存储到sqlite my sql span class token double colon punctuation span span class token function my sql span span class
  • SQL常用语句大全

    创建表and插入数据 课程表 span class token keyword create span span class token keyword database span stuinfo span class token comm
  • 2020-08-21 多路复用TCP双向通信

    多路复用TCP双向通信 首先说一下多路复用 多路的作用 xff1a 监测文件描述符的状态变化 监测文件描述符是否有数据可读写 状态变化 xff1a 有数据可读 xff0c 有数据可写 xff0c 异常 有可能需要监测多个文件描述符 多个文件
  • ros中gmapping建图

    准备 1之前在github上下载的双轮差速小车中有该小车的gmapping和键盘控制的文件可以直接用 2如果之前安装的不是ros的full版本还需要下载gmapping功能包 sudo apt get install ros indigo
  • ros导航仿真——定位与路径规划

    准备 之前在github上下载的差速双轮小车不仅有其对应的gmapping还有amcl和move base xff0c 其中amcl用于定位 xff0c move base 用于路径规划 首先启动小车 roslaunch diff whee
  • arm底层通讯接口之uart

    1 目的 写这篇博文的主要目的就是让其他初学者能够更快的理解 掌握uart串口通讯 xff0c 在学习底层接口通讯的时候 xff0c 我们要带着这么几个问题 xff1a 1 xff09 什么是uart 2 xff09 uart有什么用 3
  • ros中Odom话题与odom坐标系的理解

    odom话题发表的是odom坐标系到base link之间的转换关系 xff0c 以及机器人的速度 其中base like是机器人本体坐标系 xff0c 与机器人中心重合 xff0c 所以odom坐标系到base link之间的转换关系也就
  • 多机器人导航与编队(一)

    多个机器人中让领导者导航 xff0c 相比于单个机器人导航需要修改的参数如下 主要是多机器人中的领导者与单个机器人发布的话题名称不一样 小车启动文件设置与简化 1设置 在小车的xacro文件的diff插件中添加 span class tok
  • 多机器人导航与编队(二)

    小车导航文件设置 导航分为两部分 xff1a 定位amcl和规划move base xff08 我自己的项目 导航对应ares1 maze2 amcl launch里面包含ares1 amcl launch xml 对应定位amcl xff
  • 多个小车相同功能的节点编写以及launch文件相关设置

    对于n个小车的相同功能 xff0c 写cpp 1写n个cpp 2写1个cpp xff0c 将n个小车的内容集中到一起 3写1个cpp xff0c 长度与单个相同 在launch文件中启动n个这样相同的节点 传入n个不同的参数 关于launc
  • ROS 多机器人导航salm中的问题

    ros中slam理解 在ROS中 xff0c 进行导航需要使用到的三个包是 xff1a xff08 1 xff09 move base xff1a 根据参照的消息进行路径规划 xff0c 使移动机器人到达指定的位置 这个路径规划包括全局路径
  • 一文读懂串口(波形分析、起始位、数据位、停止位、空闲位)

    串口 一 串口 xff08 串行接口 xff09 二 异步串口 xff08 以下统称串口 xff09 三 重要参数1 波特率2 报文格式2 1 起始位2 2 数据位2 3 奇偶校验位2 4 停止位2 5 空闲位 四 波形1 具体连接2 波形
  • #学习笔记 keil环境下单片机模块化编程的方法

    1 选择 add new item to group 建立一个 c文件 xff0c 一个 h文件 xff0c 并且名字一致 2 h文件的写法 xff08 1 xff09 h文件中要有首位两段语言 例如 ifndef HEARTRATE H

随机推荐

  • 【Drone】航模遥控系统各协议简介

    最近学习了无人机的一些知识 xff0c 在关于遥控系统这部分的各种协议看的有些头大 xff0c 人都晕了 看了一些资料后终于大概理解了这套系统中那些一团乱麻般的各协议的意义 xff0c 大致总结一下 图一 遥控系统组成 这里参考FPV帮装机
  • C语言获取当前的工作路径

    在C语言中获取当前的工作路径的方法一般是用内置函数为 xff1a DWORD GetModuleFileName HMODULE hModule LPTSTR lpFilename DWORD nSize 函数的参数说明 xff1a hMo
  • C/C++的指针传递和引用传递

    相信你遇到过指针传参 值传参 引用传参 xff0c 这三个关系足够让你头脑爆炸 xff0c 搞不清楚三者的区别 但是恭喜你 xff0c 你看到了这篇文章 xff0c 小编保证你看后茅塞顿开 xff0c 一下子就顺畅了 首先 xff0c 我们
  • #define、typedef 和 using之间的联系和区别

    目录 一 define 1 含义 2 用处 1 条件编译 2 解宏 3 文件包含 二 typedef 1 含义 2 用处 1 数据类型别名 2 指针别名 3 结构体别名 4 与平台无关的数据类型 三 using 1 含义 2 用处 1 权限
  • C++四种cast的详细介绍

    目录 一 static cast 1 基本数据类型转换 2 指针和void指针的转换 3 父类和子类之间的转换 二 dynamic cast 三 const cast 1 加上const 2 去掉const xff08 1 xff09 co
  • C++内存模型简述

    目录 一 什么是内存模型 二 内存的分类 三 各分区例程 1 全局 静态存储区 2 常量区 3 栈 xff08 Stack xff09 区域 4 堆 xff08 Heap xff09 区域 四 堆和栈的区别 五 堆和自由存储区的区别 1 m
  • Eclipse的介绍和插件使用

    目录 一 Eclipse的介绍 二 快捷方式 三 常用快捷键 四 插件开发 五 插件安装 第一种 xff1a 直接复制法 第二种 xff1a 使用link文件法 第三种 xff1a 使用eclipse自带图形界面安装 第四种 xff1a 使
  • 动态时间规整算法——DTW

    没有做过机器学习的小伙伴们对这个算法应该不是特别的了解 xff0c 因为机器学习经常会用到这个算法 再将这个算法之前 xff0c 我们先看一下初中的知识点 欧几里得距离 在讲解动态时间规整算法 xff08 Dynamic Time Warp
  • C++ 中的基本输入/输出

    C 43 43 附带的库为我们提供了许多执行输入和输出的方法 在 C 43 43 中 xff0c 输入和输出以字节序列或更通常称为流的形式执行 输入流 xff1a 如果字节流的方向是从设备 xff08 例如 xff0c 键盘 xff09 到
  • 单例设计模式

    单例设计模式是一种经典的面向对象设计模式 xff0c 它允许在一个应用程序中只创建一个实例对象 xff0c 以便在整个应用程序中共享该对象的状态和行为 单例模式通常用于管理应用程序级别的资源 xff0c 例如数据库连接 线程池 配置对象等
  • 代理设计模式

    一 概述 代理设计模式是一种结构型设计模式 xff0c 它允许在一个对象和其它对象之间添加一个代理对象 xff0c 以控制对原始对象的访问 代理对象通常在访问原始对象之前或之后执行一些额外的操作 xff0c 例如记录日志 控制访问权限 缓存
  • C++线程入门:轻松并发编程

    在现代计算机应用程序中 xff0c 我们经常需要处理并发任务 xff0c 这就需要使用多线程来实现 C 43 43 是一种功能强大的编程语言 xff0c 提供了丰富的线程支持 xff0c 使得并发编程变得相对容易 C 43 43 线程是一种
  • 中断与DMA

    中断 Cortex M3256 个优先级和 128 个抢占级悬起pending 中断中断的类型中断结构 DMA通道映射源传输和目标传输寄存器中断状态寄存器和中断标志清除寄存器通道x配置DMA stream x configuration r
  • keil编译时候出现function “ ” declared implicitly的解决方法

    在警告信息function declared implicitly双引号中的 表示的是所调用函数 xff0c 在调用该函数的前加 extern 声明即可
  • 2022年高教社杯全国大学生数学建模国赛B题思路详解

    1 比赛报名与思路解析 xff08 持续更新750967193 xff09 2 比赛时间 xff1a 2022年9月15日18点到2022年9月18日20点 如下为B题思路 xff1a 先贴题目 xff1a 如下是初步分析 xff1a 无人
  • 旋转矩阵、欧拉角之间转换

    学习过程中涉及欧拉角和旋转矩阵的转换 xff0c 索性整理学习一下欧拉角四元数和旋转矩阵的概念以及matlab中的互相转换 本文摘自各大课本 xff0c 博客 xff0c 自己学习整理使用 xff0c 侵删 MATLAB矩阵乘法从左到右依次
  • ROS中C++ boost编程,类内回调函数

    首先熟悉boost bind 定义如下函数 xff1a span class token keyword int span span class token function f span span class token punctuat
  • 理解头文件(.h)、库文件(.lib)、和动态链接库文件(.dll),Fortran中的预处理及Fortran中function的简单使用

    文章目录 问题来源我的问题头文件 库文件和动态链接库头文件 h库文件 lib动态链接库 dll三者的关系静态链接动态链接 初识 Fortran 预处理包含文件 include Fortran中function简单使用声明interface调
  • OpenCV计算机视觉库,Tensorflow深度学习框架

    OpenCV是计算机视觉库 xff0c 包含了大量的图像处理和计算机视觉的算法 xff0c 但是在机器学习方面明显不足 xff0c ML模块只有SVM xff0c MLP xff0c kNN等有限的几种算法 dnn模块也是调用别的框架 Te
  • 动态库和静态库

    概念 什么是库 库是写好的 xff0c 现有的 xff0c 成熟的 xff0c 可以复用的代码 现实中每个程序都要依赖很多基础的底层库 xff0c 不可能每个人的代码都从零开始 xff0c 因此库的存在意义非同寻常 本质上来说 xff0c