动静态库的使用(Linux)

1.库

通俗来说,库就是现有的,可复用的代码,例如:在C/C++语言编译时,就需要依赖相关的C/C++标准库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。通常我们可以在windows下看到一些后缀为.dll,.lib等就是库文件。

静态库:.a[Linux]、.lib[windows]

动态库:.so[Linux]、.dll[windows]

2. 静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再
需要静态库。

注意:一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,而我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采用同名静态库。(因为动态库,更节省空间,后面有详细讲解)

2.1 生成静态库

这里首先要介绍一个工具(命令)

ar  -rc  $@ $^

@:归档的目标文件,^:归档的.o文件
rc 表示 (replace and create)

 这里Makefile文件来举例:

libmyc.a:mystdio.o mymath.oar -rc $@ $^
%.o:%.cgcc -c $<.PHONY:clean
clean:rm -f *.a *.o.PHONY:output
output:mkdir mylibcmkdir -p mylibc/includemkdir -p mylibc/lib cp *.h mylibc/includecp *.a mylibc/libtar czf mylibc.tgz mylibc

这里就是将写的mysdio.c 和mymath.c文件打包成静态库,并且压缩。

 2.2 静态库使用

这里直接在编译代码时包含上述头文件,是不能直接使用的,如:

#include "mystdio.h"
#include "mymath.h"

这里有三种情况:

情况一:头文件和库文件和我们自己的源文件在同一个路径下时

只需要-L选项即可:

gcc  main.c  -L. -lmyc

 -L:表示当前路径下寻找库文件;

-lmyc:使用时是在库文件(即libmyc.a)前面加-l,并且去掉后缀.a。

情况二:头文件和库文件有自己的独立路径

gcc main.c -I头文件路径 -L库文件路径 -lmyc

-I: 指定头文件搜索路径;

情况三::头文件和库文件安装到系统路径下

这里要讲一下如何将库文件和头文件安装在系统路径下:

mv libmyc.a /lib64/#库文件放到/lib64/路径下mv *.h /usr/include/#头文件放到/usr/include/路径下

将上述文件配置好后,就可以直接指定需要使用的库文件(不需要带-),就可以形成可执行程序了。

gcc  main.c  -lmyc

3. 动态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采
用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空
间。

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表(got),而不是动态库所在目标文件的整个机器码(二进制文件)

在可执行文件开始运行以前,动态库的机器码(二进制文件)由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(后两点在后面"ELF文件"文章中有讲解)

3.1 动态库生成

libmyc.so:mystdio.o mymath.ogcc -o $@ $^ -shared
%.o:%.cgcc -fPIC -c $<.PHONY:clean
clean:rm -f *.a *.o.PHONY:output
output:mkdir mylibcmkdir -p mylibc/includemkdir -p mylibc/lib cp *.h mylibc/includecp *.so mylibc/libtar czf mylibc.tgz mylibc

shared: 表示生成共享库格式

fPIC:产生位置无关码(position independent code)

一般情况下动态库文件使用.so后缀

3.2 动态库使用

这里动态库的使用和前面静态库的基本一致,三种情况是一样的,使用-I,-L选项是一样的。

但是这里有个很大的问题:

形成的可执行文件不能运行

这里通过ldd命令操作,查看该可执行文件所链接的动态库:

ldd a.outlinux-vdso.so.1 => (0x00007fff4d396000)libmyc.so => not foundlibc.so.6 => /lib64/libc.so.6 (0x00007fa2aef30000)/lib64/ld-linux-x86-64.so.2 (0x00007fa2af2fe000)

可以看到并不能找到用户链接得动态库。

这里还要解释一下,为什么前面静态库没有这个问题,因为静态库链接时,会将全部库文件加载到可执行文件中,并不需要执行时去寻找链接得库,但是链接动态库,执行时就需要去寻找动态库。

3.2.1 解决方案

方案一:这里也可以通过之前的方法,将拷贝 .so 文件到系统共享库路径下, 一般指/lib64。

方案二:向系统共享库路径下建立同名软连接:

ln -s 路径 目标路径(/lib64/目标文件名)

方案三:导入环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R²ec: 构建具有推理能力的大型推荐模型,显著提示推荐系统性能!!

摘要&#xff1a;大型推荐模型通过编码或项目生成将大型语言模型&#xff08;LLMs&#xff09;扩展为强大的推荐工具&#xff0c;而近期在LLM推理方面的突破也同步激发了在推荐领域探索推理的动机。目前的研究通常将LLMs定位为外部推理模块&#xff0c;以提供辅助性思考来增强传…

【Java后端基础 005】ThreadLocal-线程数据共享和安全

&#x1f4da;博客主页&#xff1a;代码探秘者 ✨专栏&#xff1a;文章正在持续更新ing… ✅C语言/C&#xff1a;C&#xff08;详细版&#xff09; 数据结构&#xff09; 十大排序算法 ✅Java基础&#xff1a;JavaSE基础 面向对象大合集 JavaSE进阶 Java版数据结构JDK新特性…

Tesseract配置参数详解及适用场景(PyTesseract进行OCR)

在使用 PyTesseract 进行 OCR 时&#xff0c;合理配置参数是提高识别准确率的关键。以下是 Tesseract 常用参数的详细解释和适用场景。 一、关键参数 &#xff08;1&#xff09;页面分割模式&#xff08;Page Segmentation Mode, --psm&#xff09; 控制 Tesseract 如何分析…

【Zephyr 系列 12】BLE + NVS + 低功耗融合实战:打造可配置蓝牙信标系统

🧠关键词:Zephyr、BLE 广播、信标、NVS 参数、低功耗、状态机、周期唤醒 📌适合人群:希望实现 BLE 信标类产品(定位标签、资产管理)的开发者 📊预计篇幅:约 5200+ 字 🎯 项目目标 构建一个可广泛应用于资产标签、定位信标、设备标识等场景的蓝牙广播模块,具备:…

图解浏览器多进程渲染:从DNS到GPU合成的完整旅程

目录 浏览器进程架构的演化 进程和线程关系图示 进程&#xff08;Process&#xff09; 线程&#xff08;Thread&#xff09; 协程&#xff08;Coroutine&#xff09; 进程&线程&协程核心对比 单进程和多进程浏览器 单进程浏览器​编辑 单进程浏览器存在的问题…

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…

C# 类和继承(抽象成员)

抽象成员 抽象成员是指设计为被覆写的函数成员。抽象成员有以下特征。 必须是一个函数成员。也就是说&#xff0c;字段和常量不能为抽象成员。必须用abstract修饰符标记。不能有实现代码块。抽象成员的代码用分号表示。 例如&#xff0c;下面取自一个类定义的代码声明了两个抽…

基于JWT+SpringSecurity整合一个单点认证授权机制

基于 JWT Spring Security 的授权认证机制&#xff0c;在整体架构设计上体现了高度的安全性与灵活性。其在整合框架中的应用&#xff0c;充分展示了模块化、可扩展性和高效鉴权的设计理念&#xff0c;为开发者提供了一种值得借鉴的安全架构模式。 1.SpringSecurity概念理解 …

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…

Git 切换到旧提交,同时保证当前修改不丢失

在 Git 中&#xff0c;可以通过以下几种方式切换到之前的提交&#xff0c;同时保留当前的修改 1. 使用 git checkout 创建临时分离头指针&#xff08;推荐用于查看代码&#xff09; git checkout <commit-hash>这会让你进入"分离头指针"状态&#xff0c;你可…

东芝Toshiba DP-4528AG打印机信息

东芝 Toshiba DP 4528AG 是一款黑白激光数码复合机&#xff1a; 类型&#xff1a;激光数码复合机&#xff0c;涵盖复印、打印、扫描、传真功能&#xff0c;能满足办公室多样化的文档处理需求。速度类型&#xff1a;中速&#xff0c;黑白复印和打印速度可达 45 页 / 分钟&#…

Qt生成日志与以及捕获崩溃文件(mingw64位,winDbg)————附带详细解说

文章目录 Qt生成日志与以及报错文件(mingw64位&#xff0c;winDbg)0 背景与结果0.1 背景0.2 结果1 WinDbg1.1 安装1.2 使用 2 编写代码2.1 ccrashstack类2.2 编写输出捕获异常的dmp文件2.2 编写输出日志文件2.3 调用生成日志和dmp文件 参考 Qt生成日志与以及报错文件(mingw64位…

Nginx + Tomcat负载均衡群集

目录 一、案例环境 二、部署 Tomcat&#xff08;102/103&#xff09; 1、准备环境 &#xff08;1&#xff09;关闭firewalld 防火墙 &#xff08;2&#xff09;安装JDK 2、安装配置 Tomcat &#xff08;1&#xff09;Tomcat 的安装和配置 &#xff08;2&#xff09;移动…

三、元器件的选型

前言&#xff1a;我们确立了题目的功能后&#xff0c;就可以开始元器件的选型&#xff0c;元器件的选型关乎到我们后面代码编写的一个难易。 一、主控的选择 主控的选择很大程度上决定我们后续使用的代码编译器&#xff0c;比如ESP32使用的是VScode&#xff0c;或者Arduino&a…

API是什么意思?如何实现开放API?

目录 一、API 是什么 &#xff08;一&#xff09;API 的定义 &#xff08;二&#xff09;API 的作用 二、API 的类型 &#xff08;一&#xff09;Web API 1. RESTful API 2. SOAP API &#xff08;二&#xff09;操作系统 API &#xff08;三&#xff09;数据库 API …

AI生成的基于html+marked.js实现的Markdown转html工具,离线使用,可实时预览 [

有一个markdown格式的文档&#xff0c;手头只有notepad的MarkdownPanel插件可以预览&#xff0c;但是只能预览&#xff0c;不能直接转换为html文件下载&#xff0c;直接复制预览的内效果又不太好&#xff0c;度娘也能找到很多工具&#xff0c;但是都需要在线使用。所以考虑用AI…

Java-前置基础

前言 基础基础 package org.example;public class Main {int a 10;String s1 "你好";public static void main(String[] args) {System.out.println(a);System.out.println(s1);} } 发现报错位置 public class Main {static int a 10;static String s1 "你好…

python字符串方法

1. capitalize&#xff1a; 是第一个字符大写&#xff0c;其余小写 2. encode&#xff1a; 将字符串转换为字节串&#xff08;bytes&#xff09;&#xff0c;默认使用 UTF-8 编码。 3. format&#xff1a; format是 Python 中字符串对象的内置方法&#xff0c;语法为S.form…

Java详解LeetCode 热题 100(24):LeetCode 234. 回文链表(Palindrome Linked List)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 回文链表的特征2.2 核心难点 3. 解法一&#xff1a;转换为数组法3.1 算法思路3.2 详细图解3.3 Java代码实现3.4 详细执行过程演示3.5 执行结果示例3.6 使用数组而非ArrayList的优化版本3.7 复杂度分析3.8 优缺点分析 4. 解…

平板电脑如何通过EN 18031认证

平板电脑若需通过 EN 18031 认证&#xff08;欧盟无线电设备网络安全标准&#xff0c;属于 CE RED 指令的一部分&#xff09;&#xff0c;需满足其针对互联网连接设备和数据处理设备的安全要求。以下是详细的认证流程、技术要求和操作指南&#xff1a; 一、认证背景与法规基础…