Linux--动静态库的原理和使用详解

本文介绍了Linux系统中动态库与静态库的概念、原理以及使用方法。通过深入讲解动态库与静态库的区别和优劣势,帮助读者更好地理解并选择合适的库类型来进行软件开发。

动态库和静态库的概念

  1. 动态库(Dynamic Link Library,简称DLL):在运行时加载的库文件,不会被复制到可执行程序中,可以被多个程序共享使用。
  2. 静态库(Static Library):在编译时被链接到目标代码中的库文件,会被复制到可执行程序中,每个程序都有自己的副本。
    在这里插入图片描述

动静态库的使用和制作

具体步骤

  1. 创建源代码文件:首先,编写你的库的源代码文件,可以是一个或多个源码文件。这些文件包含了你想要封装在库中的函数、变量和其他定义。

  2. 编写头文件:创建一个头文件(通常以.h作为文件扩展名),用于存放库的接口声明。在头文件中定义公共的结构、函数原型和常量。

  3. 编译源代码文件:使用合适的编译器对源代码文件进行编译,生成目标文件(通常以.o作为文件扩展名)。例如,在Linux上可以使用gcc命令进行编译,如:gcc -c file1.c file2.c

  4. 创建静态库:将所有的目标文件打包成一个静态库文件(通常以.a作为文件扩展名)。使用ar命令创建静态库,如:ar rcs libyourlibrary.a file1.o file2.o。其中,'libyourlibrary.a’是静态库的名称,'file1.o’和’file2.o’是目标文件。

  5. 创建动态库:将所有的目标文件编译成一个动态链接库文件(通常以.so作为文件扩展名)。使用合适的编译器和链接器创建动态库,如:gcc -shared -o libyourlibrary.so file1.o file2.o。其中,'libyourlibrary.so’是动态库的名称,'file1.o’和’file2.o’是目标文件。

  6. 使用静态库:在编译可执行程序时,将静态库链接到程序中。例如,在使用gcc编译时添加’-L’选项指定库的路径,'-l’选项指定库的名称,如:gcc -o myapp main.c -L/path/to/library -lyourlibrary

  7. 使用动态库:在编译可执行程序时,可以使用静态方式链接动态库,也可以在运行时动态加载动态库。在使用gcc编译时添加’-L’选项指定库的路径,'-l’选项指定库的名称,如:gcc -o myapp main.c -L/path/to/library -Wl,-rpath,/path/to/library -lyourlibrary

实例操作

在这里插入图片描述
在这里插入图片描述

前章内容:重定向和文件缓冲

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建静态库

在这里插入图片描述

创建动态库

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动静态库同时存在

在这里插入图片描述
在这里插入图片描述

动态库与静态库的区别

  1. 文件大小:动态库较小,静态库较大。
  2. 内存占用:动态库在运行时加载,不会占用程序的内存;而静态库会被完全加载到程序的内存中。
  3. 载入速度:动态库的载入速度较慢,因为需要在运行时进行加载和链接;而静态库的载入速度较快,因为已经被编译并链接到程序中。
  4. 更新与维护:动态库的更新只需替换库文件,不需要重新编译程序;而静态库的更新需要重新编译整个程序。
  5. 可重定位性:动态库可以在不同的系统上使用,因为动态链接器会解析库的依赖关系;而静态库需要重新编译适配不同的系统。

动态库的加载

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

动态库与静态库的选择

  1. 动态库适合需要共享使用的库,减少内存占用
  2. 静态库适合需要独立部署的程序,减少运行时的依赖
  3. 根据项目需求和系统环境特点综合考虑选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

加速新能源汽车产品迭代:融合前沿科技的重要性

新能源汽车新质生产力提升咨询方案 一、新能源汽车企业行业目前发展现状及特点: 1、快速增长 2、技术迭代快 3、竞争加剧 二、新能源汽车企业发展新质生产力面临的痛点: 1、技术创新压力巨大 2、市场竞争激烈 3、供应链稳定性欠缺 4、成本控制压…

【Linux】网络编程套接字一

网络编程套接字一 1.预备知识1.1理解源IP地址和目的IP地址1.2认识端口号1.3认识TCP协议1.4认识UDP协议1.5网络字节序 2.socket编程接口3.UDP网络程序3.1UDP Server服务器端3.2UDP Client客户端 4.根据UDP客户端服务端做的设计4.1字典热加载4.2shell命令行4.3聊天室 5.windows客…

疲劳检测YOLOV8

疲劳检测YOLOV8,只需要OPENCV,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDROID开发疲劳检测YOLOV8

HCIP —— 生成树 (下)

目录 STP(生成树)的角色选举 根网桥 根端口 选举规则: 指定端口 生成树的端口状态 STP的接口状态:禁用、阻塞、侦听、学习、转发 五种状态 禁用状态 阻塞状态 侦听状态 学习状态 转发状态 当生成树拓扑结构发生变化 …

Http中Host,Referer,Origin和Access-Control-Allow-Origin

Http中Host,Referer,Origin和Access-Control-Allow-Origin 文章目录 Http中Host,Referer,Origin和Access-Control-Allow-OriginHost定义特性作用 Referer定义特性作用 Origin定义特性作用 Access-Control-Allow-Origin定义特性作用…

003- AutoCoder 使用Web版大模型,性感的Human As Model 模式

这是下面这篇文章的继续。 002- 用 AutoCoder 添加和修改代码 前面我们提到,如何解决你没有API版大模型,或者你的API版大模型太弱,而你只有Web版本的诸如 Kimi/GPT4 的情况下,改如何让AutoCoder帮助你完成编程? 我们有…

2024,淘天六大升级,电商人都准备好了吗?|淘天商品API数据采集接口

电商进入存量时代, 淘天仍是电商重心和基本盘 我们说现在的电商仍有红利,只是竞争愈发激烈,从增量时代发展到存量时代。 进入存量竞争时代,全平台布局已成行业共识。 电商淘天官方订单及商品详情API数据采集接口 但无论如何&…

删除数组中的指定元素(了解如何删除数组中的指定元素,并返回一个新的数组,看这一篇就足够了!)

前言:有时候我们会遇到要在数组中删除指定元素,但是不能创建新的数组,那么这个时候应该如何操作呢? ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多讲,让我们…

Go——指针和内存逃逸

区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 要搞明白Go语言中的指针概念需要先知道3个概念:指针地址,指针类型和指针取值。 一. Go语言的指针 Go语言中的函数传参都是值拷贝,当我们想修改某个…

页面router路由设计

Vue命名视图 命名视图 | Vue Router 如果要在 如何要在main区域里使用路由的话,整体区域是Layout,内涵Header和Nav以及Main path: /index,name: index,component: Layout, 若要只修改main区域的话,则取要加上v-if判断,来确实是…

Redis I/O多路复用

I/O多路复用 Redis的I/o多路复用中,将多个连接放到I/O复用程序中,这个复用程序具体是什么,是Redis的主线程吗 在Redis的I/O多路复用机制中,“复用程序”实际上指的是操作系统提供的系统调用接口,如Linux下的epoll、sel…

【办公类-16-07-07】“2023下学期 中班户外游戏2(有场地和无场地版,每天不同场地)”(python 排班表系列)

作品展示 背景需求: 2024年2月教务组发放的是“每周五天内容相同,两周10天内容相同”的户外游戏安排 【办公类-16-07-05】合并版“2023下学期 大班户外游戏(有场地和无场地版,两周一次)”(python 排班表系…

论文导读 | 漫谈图神经网络

本文主要介绍图神经网络相关内容,包括图神经网络的基本结构以及近期研究进展。 背景 在实际生活中,许多数据都可以用图的形式表达,比如社交网络、分子模型、知识图谱、计算机网络等。图深度学习旨在,显式利用这些数据中的拓扑结…

【VALL-E-01】环境搭建

本系列文章系本人知乎账号迁移 本文系个人知乎专栏文章迁移 VALL-E 网络是GPT-SOVITS很重要的参考 知乎专栏地址: 语音生成专栏 相关文章链接: 【VALL-E-01】环境搭建 【VALL-E-02】核心原理 1、环境包使用 从效果看没有GPT-SOVITS 来的好 环境安装…

C#宿舍信息管理系统

简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…

Java异常类型及异常处理方式

本章学习内容:使用异常处理机制,对程序运行过程中出现的异常情况进行捕捉并处理. 目录 📌 Java异常概述 📌 Java异常体系结构 📌 常见的异常 📌 异常处理 📌 Java异常概述 ○ 异常的概念&…

电商API数据采集接口——电商大数据构建及智能应用

现在越来越多的电商企业和运营都开始关注数据的应用,在13年淘宝运营技巧的爆发,这其实就是数据带来的红利。在数据大爆炸的时代,数据分析已经成为了企业制定策略、发现问题的重要方法,所以,数据分析绝对是企业管理的贤…

Linux命令学习入门

文章目录 登录注销关机重启Vim编辑器快捷键文件目录类打包、解包、压缩和解压指令输出重定向>和追加>>指令时间日期类搜索查找类用户管理文件所有者所在组权限管理变更权限crond任务时间调度crond相关指令:特殊符号说明: at定时任务磁盘分区磁盘…

数据结构 之 栈与单调栈习题 力扣oj(附加思路版)

#include<stack> --栈的头文件 栈的特点 &#xff1a; 先进后出 &#xff0c; 后进先出 相关函数&#xff1a; top() 获取栈顶元素 ,返回栈顶元素的值 pop() 删除栈顶元素 ,没有返回值 push() 放入元素 ,没有返回值 empty() 为空返回 true 否则返回false size() 元素…

fs模块与path模块 综合练习

一、自定义一个递归函数&#xff0c;来获取目录下所有的文件信息(目录除外)&#xff0c;以数组形式返回。 注意&#xff1a;因为异步涉及到等待&#xff0c;所以使用同步完成 //导入fs 与 path const fsrequire(fs); const pathrequire(path);function readFiles(paths){ // …