Linux操作系统--静态库和动态库的生成and四种解决加载找不到动态库的四种方法
目录
必要的知识储备:
生成静态库:
生成动态库:
解决加载找不到动态库的四种方法:
第一种:拷贝到系统默认的库路径 /usr/lib64/
第二种:在系统默认的库路径/usr/lib64/下建立软链接
第三种:将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中
第四种:/etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig()即可
必要的知识储备:
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不需要静态库
- 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
- 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
- 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
- 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
生成静态库:
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。所以,在和库的代码链接之前,得把我们的.c文件进行编译生成.o文件。
gcc -c .c文件名 -o .o文件名
有了.o文件,我们我们就要生成静态库
ar -rc libmymath.a mymath.o(.a代表的是静态库,rc表示replace、create,就是静态库中有同名的就替换,没有就创建一个新的)
查看静态库中的目录列表:ar -tv libmymath.a(静态库名称)
t:列出静态库中的文件
v:verbose 详细信息
我们创建一个.c文件,去尝试使用静态库
出现第一个问题:明明我们main.c文件已经包含了头文件,且头文件也在当前路径,但是为什么编译失败?
编译失败就是找不到库路径
因为编译器寻找.c文件里的头文件直接到系统指定目录查找头文件 ,一般用于包含标准库头文件。所以找不到库路径
gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。
库搜索指定路径:
- 从左到右搜索-L指定的目录。
- 由环境变量指定的目录(LIBRARY_PATH)
- 由系统指定目录:/usr/lib /usr/local/lib
把我们提供的方法给别人用,有两种方法:
- 把源文件直接给他
- 把源代码想办法打包成库 = 库 + .h
我们可以用makefile帮助我们更轻松的生成静态库
1 lib=libmymath.a2 3 $(lib):mymath.o4 ar -rc $@ $^5 mymath.o:mymath.c6 gcc -c $^7 8 .PHONY:clean9 clean:10 rm -rf *.o *.a lib11 12 .PHONY:output 13 output:14 mkdir -p lib/include15 mkdir -p lib/mymathlib16 cp *.h lib/include17 cp *.a lib/mymathlib18
我们平时用的库如果都是别人成熟的库,都采用直接安装到系统的方式
生成动态库:
gcc -fPIC -c myprint.c
gcc -shared -o libmyprint.so myprint.o
fPIC:产生位置无关码(可以不了解,可以浅略阅读下面关于-fPIC知识)
shared:表示生成共享库格式
库名规则:libxxx.so
关于-fPIC知识
在使用gcc编译生成动态库时,通常需要使用-fPIC(Position Independent Code)选项来生成位置无关的代码。这是因为动态库是在加载时动态链接到程序中的,而且可能会加载到内存的任意位置,因此需要生成位置无关的代码,以确保代码可以正确运行。
具体来说,`-fPIC`选项的作用包括:
1. 生成可重定位的代码:位置无关代码可以被加载到任何地址,不会受到地址空间限制。
2. 允许动态库在内存中共享代码段:多个程序可以共享同一个动态库的代码段,减少内存占用。
3. 支持更灵活的共享库加载方式:使得动态链接更为灵活,可以在程序运行时根据需要加载动态库。因此,在生成动态库时,使用`-fPIC`选项可以确保生成的库具有位置无关性,适合被动态链接到不同程序中使用。
gcc main.c -L. -lmyprint
库文件名称和引入库的名称
如:lib.c.so->c库,去掉前缀lib,去掉后缀.so,.a
解决加载找不到动态库的四种方法:
- 拷贝到系统默认的库路径 /user/lib64/
- 在系统默认的库路径/user/lib64/下建立软链接
- 将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中
- /etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig()即可
第一种:拷贝到系统默认的库路径 /usr/lib64/
第二种:在系统默认的库路径/usr/lib64/下建立软链接
第三种:将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中
第四种:/etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig()即可
系统维护自己的动态库,配置文件里放的都是路径
用makefile生成动静态库
dy-lib=libmethod.so 2 static-lib=libmymath.a3 4 .PHONY:all5 all: $(dy-lib) $(static-lib)6 7 8 $(static-lib):mymath.o9 ar -rc $@ $^10 mymath.o:mymath.c11 gcc -c $^12 13 $(dy-lib): myprint.o14 gcc -shared -o $@ $^15 myprint.o:myprint.c16 gcc -fPIC -c $^17 18 19 .PHONY:clean20 clean:21 rm -rf *.o *.a *.so mylib22 23 .PHONY:output24 output:25 mkdir -p mylib/include26 mkdir -p mylib/lib27 cp *.h mylib/include28 cp *.a mylib/lib29 cp *.so mylib/lib
相关文章:
Linux操作系统--静态库和动态库的生成and四种解决加载找不到动态库的四种方法
目录 必要的知识储备: 生成静态库: 生成动态库: 解决加载找不到动态库的四种方法: 第一种:拷贝到系统默认的库路径 /usr/lib64/ 第二种:在系统默认的库路径/usr/lib64/下建立软链接 第三种࿱…...
安科瑞能源管理系统如何解决工业园区能源管理难,运维成本高的问题?
一、行业痛点:高能耗背后的“隐形炸弹 1. 能源管理粗放:水、电、气、冷热等多类型能源分散管理,人工抄表效率低,跑冒滴漏难追踪。 2. 电能质量隐患:变频设备引发谐波干扰,导致设备停机、电容器烧毁&#…...
大模型赋能工业制造革新:10个显效可落地的应用场景
在工业4.0的汹涌浪潮中,制造业正面临着前所未有的转型挑战。传统制造模式在效率、成本、质量等方面逐渐难以满足市场需求,企业急需借助新技术实现数字化转型,以提升自身竞争力。在此背景下,基于先进的数据分析技术、大模型、知识图…...
【android bluetooth 框架分析 02】【Module详解 4】【Btaa 模块介绍】
1. 背景 我们在上一篇文章中介绍 HciHal 模块时,有如下代码 // system/gd/hal/hci_hal_android_hidl.ccvoid ListDependencies(ModuleList* list) const {list->add<SnoopLogger>();if (common::init_flags::btaa_hci_is_enabled()) {list->add<ac…...
gitee新的仓库,Vscode创建新的分支详细步骤
第一步点击创建分支输入新分支的名字 第二步 第三步 第四步...
OpenHarmony - 小型系统内核(LiteOS-A)(五)
OpenHarmony - 小型系统内核(LiteOS-A)(五) 六、文件系统 虚拟文件系统 基本概念 VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之…...
Unity动态合批(Dynamic Batching)解析
什么是动态合批? 动态合批是Unity引擎的一项核心优化技术,用于减少绘制调用(Draw Calls)数量,提高游戏性能。它通过将多个使用相同材质的小型可移动物体的渲染操作合并为单个绘制调用,减轻CPU向GPU发送命令…...
【Python】迭代器(Iterator)vs 生成器(Generator)
迭代器(Iterator) vs 生成器(Generator) 1.迭代器(Iterator)1.1 是什么?1.2 示例1.3 适用场景 2.生成器(Generator)2.1 是什么?2.2 示例2.3 适用场景 3.迭代器…...
el-input 限制只能输入负数、正数或2位小数的数值
需求 el-input需要指定输入格式,当键盘事件触发时限制只能输入负数、正数或2位小数的数值。 解决方案 自定义校验数字输入的键盘事件方法函数。 具体实现步骤 1、创建验数字输入的键盘事件方法 /*** 校验数字输入的键盘事件* param {Event} event - 键盘事件对…...
对话框类别组件编写
形如如图所示的对话框的编写 一、基本组件的定义 <template><div><el-dialogclass"cust-dialog":title"title":model-value"show":show-close"showClose":top"toppx":width"widthpx":close-on-…...
ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验
▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计,一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…...
深度剖析:生成式人工智能备案和登记的关键差异
在人工智能技术日新月异的当下,生成式人工智能以前所未有的态势广泛渗透至各个领域,从内容创作到智能客服,从图像生成到数据分析,其应用场景正呈指数级拓展。2024 年,网信部门协同相关部门,依据《生成式人工…...
kotlin + spirngboot3 + spring security6 配置登录与JWT
1. 导包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用户实体类 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…...
d3.js绘制组合PCA边缘分布图
用d3.js研发了个组合PCA边缘分布图; 组合PCA边缘分布图中包括pca散点图、散点图可根据数据自动分为连续型和离散型、还有散点的各种配置、边缘有箱线边缘、密度边缘、柱状边缘一个各个边缘的配置等等,大部分你能想到的配置都是自行传参调整的࿰…...
开源语音合成模型SparkTTS使用
一、环境配置 git clone https://github.com/SparkAudio/Spark-TTS.git pip install -r requirements.txt 二、模型下载 从modelscope进行下载,pip install modelscope 创建一个download.py import torchfrom modelscope import snapshot_downloadsnapshot_dow…...
课程9. 数据降维
课程9. 数据降维 维度灾难奇异值分解SVD 变换SVD 的几何意义 SVD分解应用示例图像压缩文本分析推荐系统中的应用* 主成分分析PCA演示使用 PCA 降低多元数据的维数PCA 说明单词的语义相似性 t-SNE 维度灾难 机器学习和数据科学中的关键问题之一是数据高维性问题。我们已经遇到过…...
24-25【动手学深度学习】AlexNet + Vgg
1. AlexNet 1.1 原理 1.2 代码 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(nn.Conv2d(1, 96, kernel_size11,stride4, padding1), nn.ReLU(),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(96, 256, kernel_size5, padding2), nn.…...
1.Axum 与 Tokio:异步编程的完美结合
摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成,掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域,高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言,能够高效地处理大量并发请求是至关重要的。Rust 语言…...
快速认识:数据库、数仓(数据仓库)、数据湖与数据运河
数据技术核心概念对比表 概念核心定义核心功能数据特征典型技术/工具核心应用场景数据库结构化数据的「电子档案柜」,按固定 schema 存储和管理数据,支持高效读写和事务处理。实时事务处理(增删改查),确保数据一致性&…...
【Linux】第十章 配置和保护SSH
1. 简单说下ssh如何实现用户的免密登录? (1)生成公钥和私钥:使用 ssh-keygen -t rsa 命令,在客户端(即你登录的机器)上生成一对密钥——公钥(~/.ssh/id_rsa.pub)和私钥&…...
量子计算:开启未来科技之门的钥匙
在当今科技飞速发展的时代,量子计算正逐渐从实验室走向实际应用,成为全球科技领域的焦点之一。它有望为众多行业带来前所未有的变革,从密码学、药物研发到金融风险评估等,量子计算的潜力不可限量。 一、量子计算的原理 量子计算基…...
基础知识 - 结构体
1、结构体类型与结构体变量 1.1 结构体的定义 结构体是一种自定义的数据类型,它把多个不同类型的变量封装在一起,形成一个新的复合数据类型。可以定义该结构体类型的变量,与使用 int 定义变量的方法相同 结构体是一些值的集合,这…...
uniapp上传图片时(可选微信头像、相册、拍照)
参考文献:微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…...
2025年4月16日华为笔试第二题200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 智慧旅游路线规划 问题描述 LYA正在开发一款智慧旅游APP,该APP需要为游客规划城市景点之间的最佳路线。城市有 N N...
面试题之高频面试题
最近开始面试了,410面试了一家公司 针对自己薄弱的面试题库,深入了解下,也应付下面试。在这里先祝愿大家在现有公司好好沉淀,定位好自己的目标,在自己的领域上发光发热,在自己想要的领域上(技术…...
一路磕磕绊绊解决flutter doctor 报错CocoaPods not installed
flutter doctor执行之后,出现以下错误: 错误消息: ✗ CocoaPods not installed.CocoaPods is a package manager for iOS or macOS platform code.Without CocoaPods, plugins will not work on iOS or macOS.For more info, see https://flutter.dev/t…...
探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因
文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …...
面试算法高频08-动态规划-01
动态规划 递归知识要点 递归代码模板:提供递归代码的标准形式public void recur(int level, int param) ,包含终止条件(if (level> MAX_LEVEL))、当前层逻辑处理(process(level, param))、向下一层递归…...
【AI】以Llama模型为例学习如何进行LLM模型微调
以Llama模型为例学习如何进行LLM模型微调 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 以Llama模型为例学习如何进行LLM模型微调背景预训练微调全部微调参数高效微调低秩适配 (LoR…...
细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
目录 一、函数vTaskList() 1、 函数说明 2、返回的字符串表格说明 3、函数的使用方法 二、 vTaskList()的应用示例 1、示例功能、项目设置 2、软件设计 (1)main.c (2)freertos.c (3)FreeRTOSConf…...
ffmpeg 添加 nvenc支持
运行以下命令检查当前 FFmpeg 是否支持 hevc_nvenc: ffmpeg -hide_banner -encoders | grep nvenc 若输出包含 hevc_nvenc,说明编码器已集成,问题出在驱动或参数配置若无输出,则需要手动编译 ffmpeg 安装显卡驱动、cuda和cudnn…...
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》 先看结果:价格展示 https://atemplate.com/pricing 旧的打折价格展示 新的打折价格展示 锚定效应是什么? 人类在进行决策时,会过度偏重先前取得的资讯(这称为锚点&…...
红宝书第四十九讲:XSS/CSRF攻击防御策略解析
红宝书第四十九讲:XSS/CSRF攻击防御策略解析 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 XSS(跨站脚本):黑客把恶意代码塞进网页,当你打开页面时&am…...
Unity基于屏幕空间的鼠标拖动,拖动物体旋转
代码的核心在于,鼠标的屏幕偏移映射到物体的旋转角度,代码中是使用射线去检测的,检测帧间隔鼠标的位置对应物体上的旋转 未解决的问题:旋转都是相对的,怎么去处理,鼠标拖动物体,物体不动&#…...
Unity3D 测试驱动开发(TDD)框架设计
前言 针对Unity3D测试驱动开发(TDD)框架的设计,需要结合Unity引擎特性与TDD核心原则,构建可维护、高效且与开发流程深度集成的测试体系。以下是分层次的框架设计方案: 对惹,这里有一个游戏开发交流小组&a…...
Google Mock(GMock):C++单元测试的高效模拟框架详解
标题: Google Mock(GMock):C单元测试的高效模拟框架详解 摘要: Google Mock(GMock)是C单元测试中的核心工具,能够高效隔离外部依赖并验证复杂交互逻辑。本文详细介绍了GMock的核心…...
智慧城市气象中台架构:多源天气API网关聚合方案
在开发与天气相关的应用时,获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具,可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API,以及其核心功能和调用…...
vue3项目启动bug
项目场景: vue3 项目启动运行 问题描述 终端无法正常启动运行 C:/user/adminC:/user/admin> npm run dev > student_status_vue30.0.0 dev > vite原因分析: 暂无 解决方案: 在当前项目目录下运行: npx vite --host…...
逻辑回归 (Logistic Regression)
文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)(…...
SLAM | 激光SLAM中的退化问题
在激光SLAM中,判断退化环境的核心是通过数学建模分析环境特征对位姿估计的约束能力。除了LOAM中提出的退化因子D外,还存在多种基于表达式和阈值设定的方法。以下是几种典型方法及其实现原理: 1. 协方差矩阵特征值分析 原理:通过分析点云协方差矩阵的特征值分布,判断环境中…...
【已更新】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 先展示问题一代码和结果、再给出四个问题详细的模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.font_manager import FontPropertiesfrom matplotlib import rcParams# 设…...
[特殊字符] 基于大模型的地理领域文档中英互译自动化方案
一、📌 项目背景与挑战 在全球化商业环境中,跨国企业经常面临专业文档翻译的痛点: 传统方式效率低下:专业文档翻译需要专人耗时数小时甚至数天 专业术语准确性难保证:地理领域术语的特殊性 格式保持困难:…...
破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战
在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…...
高度图(Heightmap)
高度图的数学组成与建模方法 高度图(Heightmap)是一种基于规则网格的地形表示方法,其数学本质是将三维地形简化为二维离散函数,通过高度值的存储和插值实现地形重建。以下从数学建模角度系统阐述其组成原理及关键技术。 一、基础…...
2025第十七届“华中杯”大学生数学建模挑战赛题目B 题 校园共享单车的调度与维护问题完整思路 模型 代码 结果分享
共享单车目前已成为不少大学校园内学生的重要通勤工具,给学生的出行带来了极大便利,但同时也产生了一些问题,如共享单车投放点位设计不合理,高峰期运力不足等。 某高校委托一公司在校园内投放了一批共享单车,经过一段时…...
ESP32-idf学习(一)搭建环境和点灯
一、前言 先说一下查到的数据(不保证准确): 1、连续四年Wi-Fi MCU全球市场份额第一,产品应用于智能家居、工业自动化、医疗健康等泛IoT领域,2024 年营收突破 20 亿元(同比 40%),…...
超详细VMware虚拟机扩容磁盘容量-无坑版
1.环境: 虚拟机:VMware Workstation 17 Pro-17.5.2 Linux系统:Ubuntu 22.04 LTS 2.硬盘容量 虚拟机当前硬盘容量180G -> 扩展至 300G 3.操作步骤 (1)在虚拟机关机的状态下,虚拟机硬盘扩容之前必…...
多线程(进阶续~)(内涵面试题)
目录 一、JUC 的常见类 1. Callable 接口 2. ReentrantLock ReentrantLock 的用法: ReentrantLock 和 synchronized 的区别: 何时使用何锁: 3. 原子类 4. 线程池 ExecutorService 和 Executors ThreadPoolExecutor 5. 信号量 Semaphore 6. C…...
OpenGL shader开发实战学习笔记:第十一章 立方体贴图和天空盒
1. 立方体贴图和天空盒 1.1. 什么是立方体贴图 立方体贴图(Cube Map)是一种纹理,它由六个纹理图像组成,每个纹理图像对应一个方向。这些方向通常是立方体的六个面,分别是“前面”,“后面”,“…...
双指针算法(二)
目录 一、力扣611——有效三角形的个数 二、牛客网3734——和为S的两个数字 三、力扣15——三数之和 四、力扣18——四数之和 一、力扣611——有效三角形的个数 题目如下: 这里我们先认识如何判断是个三角形,ab>c,ac>b,bc>a即为三角形 这里…...