【Linux】动态库与静态库的打包使用

news/2024/12/2 22:47:27/
在这里插入图片描述

💻文章目录

  • 📄前言
  • 🌺静态库
    • 概念
    • 静态库使用
    • 原理
  • 🌻动态库
    • 概念
    • 使用方法
    • 原理
  • 📓总结


📄前言

想必各位喜欢打电脑游戏,总是能游戏文件夹看到一种熟悉的文件后缀名——.lib的存在吧,你是否对其存在感到好奇,为何大部分游戏都离开它们呢?本文将带你充分了解它们的存在,这样一来以后如果有伙伴问起你,那么ta也会你知识的渊博感到佩服的吧。

🌺静态库

概念

静态库(Static Library)是在程序编译时被链接到执行文件中的一种库文件, 一般为代码的合集,可被多个程序共用,在unix-like环境中以 “.a” 、windows 以 “.lib” 的文件后缀名存在。

  • 静态库的优点:
    使用静态库的程序在运行的时候不需要依赖外部的库文件,使得程序发布不需要担心用户缺少必要的库,并且有利于程序的发布与部署

  • 静态库的缺点:
    如果程序所需的代码全都整合到静态库中,这可能导致程序体积较大,浪费用户的空间
    如果静态库更新了,所有用到该库的程序都需要被重新编译,不利于维护

静态库使用

在Linux系统中可以使用ar指令来打包.o文件,来生成静态库。

gcc -c mylib.c	#生成.o文件
ar rcs libmylib.a mylib.o mylib.h	#静态库生成
gcc -o test test.c -L. -lmylib	
# -L:指定静态库的位置。 -l:静态库的名字,需要去除前缀lib和后缀.a

原理

静态库实质就是把代码预先编译打包成二进制文件,方便代码的管理与重用,在程序编译时就被整合到了可执行文件中,简化了编译的过程,使其成为了一个独立的单元。

🌻动态库

概念

与静态库不同,动态库在程序运行时才被加载到内存当中。在unix-like系统中通常以".so"后缀存在,在windows系统中一般以".dll"后缀存在。

使用方法

gcc -fPIC -c mylib.c	#fPIC 指编译与位置无关的代码
gcc -shared -o libmylib.so mylib.o	#生产动态库
gcc -o main main.c -L. -lmylib		#链接动态库

运行程序时会出现像下面这样的报错,因为动态库和静态库不同,动态库的加载需要依赖系统来完成。

./main: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

解决方法:

  1. 直接把库文件安装到系统
cp libmylib.so /lib64
  1. 将库文件的软链接安装到系统
ln -s lib/libmylib.so /lib64/libmylib.so
  1. 修改环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/your/library

原理

动态库的加载由系统的动态链接器负责,在程序运行时根据环境变量或配置文件中指定的路径找到并加载库文件。动态库被加载到共享内存区,可以被多个程序共享使用,减少了内存占用并提高了代码的重用性。

📓总结

特性静态库动态库
加载时机编译时将代码链接至可执行文件程序运行时加载
文件大小可能较大,因为包含了所有使用到的库代码较小,因为代码在应用之间共享
更新与维护需要重新编译程序以更新库可以独立于应用更新
运行时依赖性不依赖外部库文件必须确保运行环境中有正确版本的库文件
性能启动时间更短启动时需要加载库,稍慢

📜博客主页:主页
📫我的专栏:C++
📱我的github:github


http://www.ppmy.cn/news/1381013.html

相关文章

.NET应用UI框架DevExpress XAF v23.2新版亮点 - 支持.NET 8

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在DevEx…

极简云商业版 开源源码

简化版的云商业源码已经以开源形式发布了,现在可以解绑卡密和查询卡密。总体而言,这个版本已经相当完善了。在对接示例网盘中有一个用户注册的例子,需要配置一个邮箱。您可以在网页上启用QQ邮箱的标准版SMTP,并生成一个授权码。 …

C++ std::list的merge()使用与分析

看到《C标准库第2版》对list::merge()的相关介绍,令我有点迷糊,特意敲代码验了一下不同情况的调用结果。 《C标准库第2版》对list::merge()的相关介绍 list::merge()定义 merge()的作用就是将两个list合并在一起,函数有2个版本:…

JMeter使用记录

文章目录 概述从0创建一个测试场景线程组配置元件CSV Data Set ConfigHTTP信息头管理器HTTP Cookie管理器HTTP请求默认值 逻辑控制器简单控制器IF控制器循环控制器while控制器 取样器HTTP取样 前置/后置处理器BeanShell处理器JSR223处理器 监听器查看结果树聚合报告汇总报告 概…

C# 异步调用aysnc await

一、基本概念 在C#中,async和await关键字用于异步编程。异步编程允许程序在执行I/O密集型操作时不会被阻塞,从而提高程序的性能和响应性。 async关键字用于定义异步方法,表明该方法可能包含await表达式,并且可以在其执行期间异步…

内存卡格式化危机:数据恢复之道与预防之策

在我们的日常生活和工作中,内存卡作为一种便携的存储介质,扮演着不可或缺的角色。然而,有时我们可能会遭遇一个令人头痛的问题——内存卡格式化了。这意味着原本存储在卡内的照片、视频、文档等重要数据,突然之间消失得无影无踪。…

linux内建命令/内部命令之exec

1.exec介绍 exec是linux shell内建命令,该命令将使用一个特定的命令来取代当前进程。一般当shell遇到一个命令,它会forks off一个子进程来真正的运行命令,但使用exec内建命令,shell就不会fork一个子进程了,并且命令的…

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测…