【Linux】动态库的制作与使用

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、前言:
  • 二、继续使用这四个文件
  • 三、动态库的制作
    • 第一步:
    • 第二步:
    • 第三步:
  • 四、整合将以上步骤,使用makefile自动化构建
  • 五、小结
  • 六、动态库的使用

一、前言:

续上一篇博客讲解了静态库的制作过程,本篇博客将开始动态库制作的讲解。一定要看了静态库的制作后,才能更好的理解动态库的制作过程。

二、继续使用这四个文件

分别创建了4个文件:mymath.h mymath.c myprint.h myprint.c.

  • 1.<mymath.h>:
#pragma once    
#include<stdio.h>    extern int addToTarget(int start, int end);//声明函数
  • 2.mymath.c
  #include "mymath.h"                                             #             //这段函数的作用是计算start-end之间的和int addToTarget(int start, int end)                               {                                                                int sum = 0;                                                   int i = start;                                                 for(i; i <= end; i++){                                                                                                                                 sum += i;                                                    }                                                              return sum;                                                    }  
  • 3.myprint.h
#pragma once     #include<stdio.h>    
#include<time.h>    extern void Print(const char* str);  
  • 4.myprint.c
#include "myprint.h"                                                            //这段函数功能是输出传入的字符串,后面加上时间戳                                                                    
void Print(const char* str)                                                          
{printf("%s[%d]\n",str,(int)(time(NULL)));
}       

三、动态库的制作

相对于静态库的制作,动态库的制作步骤也是十分相似。

第一步:

我么也需要先将.c文件编译成.o文件,但此时需要加上选项 -fPIC.

  • 选项-fPIC是指生成位置独立代码(Position Independent Code,PIC)。它通常用于创建可在不同内存地址空间加载的共享库(动态链接库)。

执行如下指令:

gcc -fPIC -c myprint.c -o myprint.o
gcc -fPIC -c mymath.c -o mymath.o

第二步:

将这些.o文件它打包成动态库。但是它没有单独的命令,只能使用gcc进行打包,但是需要加上 -shared的选项

执行代码:

gcc -shared myprint.o mymath.o -o libhello.so

在这里插入图片描述

第三步:

将.so动态库文件和对应的头文件.h规整拷贝到一起。
如下图:将libhello.so文件也放入lib目录中,对应的头文件依然在include目录中,lib目录中此时就存在了一个静态库和一个动态库。
在这里插入图片描述

四、整合将以上步骤,使用makefile自动化构建

相较于静态库的制作,红色框框圈起来的便是制作动态库新加入的代码。
在这里插入图片描述
此时我们便可以利用tar指令打包发送到网上,然后让别人使用了。

五、小结

在这里插入图片描述

六、动态库的使用

相对于静态库的使用是通过指定路径的方式,动态库的使用恰恰相反。不能使用指定路径的方式。

首先,我们要知道gcc默认使用动态库的。

只存在静态库cc就只能针对该库进行静态链接
同时存在动静态库默认使用动态库
同时存在动静态库,但是想使用静态库指令后面加上 -static。格式:gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello -static

为什么不能使用指定路径的方法?

  • 还记得我们在制作动态库时,使用过gcc -fPIC选项吗?它的作用就是生成位置独立代码,所以这个动态库其实一个独立的文件。动态库可以和可执行程序分批加载
  • 而我们指定路径是给gcc指定查找的,是告诉了gcc的动态库的路径。
    但是 当我们运行和加载的时候,就和gcc没有关系了,所以我们要告诉操作系统或者加载器 这个动态库的路径!
  • 那为什么静态库可以使用呢?
    静态链接的一旦编译好,就和库没有关系了,因为已经把库中代码拷贝到自己写的C/C++代码中了.即已经在可执行程序中了.

正确的使用方法:

我们只需要把我们的库的路径导入到这个环境变量【LD_LIBRARY_PATH】里面,这个是库加载时搜索的路径。
格式:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径

导入完成后,此时我们便可以成功运行了。但是这样也有一个缺点,就是每次退出之后环境变量就会清空,又得重新导入。那有没有永久性存在的 方法呢,同时保证不会污染原有的库。

  • 答案是有的;修改配置文件
    只需要在/etc/ld.so.conf.d/路径下 随便创建一个文件。
    然后vim打开文件,输入你动态库文件路径,然后退出保存即可.

未来交付给别人使用只需要提供【头文件】+【库】,不提供【源代码】

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

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

相关文章

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-2.EBS是什么?

EBS&#xff0c;即Elastic Block Storage&#xff0c;是一种云存储服务&#xff0c;旨在提供高性能、高弹性和高可用性的虚拟块设备存储。该服务的核心设计思想是计算与存储的解耦合&#xff08;Compute-Storage Disaggregation&#xff09;&#xff0c;即计算资源&#xff08;…

国内教育科技公司自研大语言模型

好未来的数学大模型九章大模型&#xff08;MathGPT&#xff09; 2023年8月下旬&#xff0c;在好未来20周年直播活动中&#xff0c;好未来公司CTO田密宣布好未来自研的数学领域千亿级大模型MathGPT正式上线并开启公测。根据九章大模型的官网介绍&#xff0c;九章大模型&#xff…

视频文字转语音经验笔记

自媒体视频制作的一些小经验&#xff0c;分享给大家。 一、音频部分&#xff1a; 1、文字转语音阐述&#xff1a; 微软语音识别&#xff1a;云希-青年男&#xff0c; 0.5-0.8变速 。注&#xff1a;云泽-中年男&#xff08;不支持长音频录制&#xff09;&#xff0c; 适合郑重…

Oracle 解决4031错误

一、问题描述 什么是4031错误和4031错误产生的原因: 简单一个句话概括: 由于服务器一直在执行大量的硬解析,导致Oracle 的shared pool Free空间碎片过多,大的chunk不足, 当又一条复杂的sql语句要硬解析时, 缺少1个足够大的Free chunk, 通常就会报4031错误. 二、解决方法 临…

亚信安全发布2024年6月威胁态势,高危漏洞猛增60%

近日&#xff0c;亚信安全正式发布《2024年6月威胁态势报告》&#xff08;以下简称“报告”&#xff09;&#xff0c;报告显示&#xff0c;6月份新增信息安全漏洞 1794个&#xff0c;高危漏洞激增60%&#xff0c;涉及0day漏洞占67.67%&#xff1b;监测发现当前较活跃的勒索病毒…

438. 找到字符串中所有字母异位词

思路&#xff1a;字母异位词在排序后会得到相同的字符串&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; class Solution { public:vector<int> findAnagrams(string s, string p) {int np.length();//p的长度vector<int> ans{};if(n&g…

2024最新版若依-RuoYi-Vue3-PostgreSQL前后端分离项目部署手册教程

项目简介: RuoYi-Vue3-PostgreSQL 是一个基于 RuoYi-Vue3 框架并集成 PostgreSQL 数据库的项目。该项目提供了一套高效的前后端分离的开发解决方案&#xff0c;适用于中小型企业快速构建现代化的企业级应用。此项目结合了 RuoYi-Vue-Postgresql 和 RuoYi-Vue3 的优点&#xff0…

为什么要设计DTO类

为什么要使用DTO类&#xff0c;下面以新增员工接口为例来介绍。 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。 后台系统中可以管理员工信息…

比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南

比赛获奖的武林秘籍&#xff1a;04 电子类比赛嵌入式开发快速必看的上手指南 摘要 本文主要介绍了电子类比赛中负责嵌入式开发同学的上手比赛的步骤、开发项目的流程和具体需要学习的内容&#xff0c;并结合自身比赛经历给出了相关建议。 正文 如何开始上手做自己第一个项目…

MySQL数据库-Windows部署MySQL环境

Windows部署MySQL环境​​​​​​ 一、下载mysql数据库 进入MySQL官方网站&#xff08;MySQL :: MySQL DownloadsMySQL&#xff09;&#xff0c;随后按如下红框方式操作&#xff1a; ​ ​ ​ ​ 这里选择的是离线安装&#xff0c;第一个是在线安装 下载好安装包后开始…

前端学习(三)CSS介绍及选择符

##最近在忙期末考试&#xff0c;因此前端笔记的梳理并未及时更新。在学习语言过程中&#xff0c;笔记的梳理对于知识的加深very vital.因此坚持在明天学习新知识前将笔记梳理完整。 主要内容&#xff1a;CSS介绍及选择符 最后更新时间&#xff1a;2024/7/4 目录 内容&#x…

Element中的表格组件Table和分页组件Pagination

简述&#xff1a;在 Element UI 中&#xff0c;Table组件是一个功能强大的数据展示工具&#xff0c;用于呈现结构化的数据列表。它提供了丰富的特性&#xff0c;使得数据展示不仅美观而且高效。而Pagination组件是一个用于实现数据分页显示的强大工具。它允许用户在大量数据中导…

阶段三:项目开发---大数据开发运行环境搭建:任务5:安装配置Kafka

任务描述 知识点&#xff1a;安装配置Kafka 重 点&#xff1a; 安装配置Kafka 难 点&#xff1a;无 内 容&#xff1a; Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;…

c#第五次作业

目录 1. 实现通用打印泛型类&#xff0c;可以打印各个集合中的值&#xff0c;方便调试 2. 计算遍历目录的耗时 3. 有哪些算术运算符&#xff0c;有哪些关系运算符&#xff0c;有哪些逻辑运算符&#xff0c;有哪些位运算符&#xff0c;有哪些赋值运算符 1&#xff09;算术运算…

浅析C++引用

浅析C引用"&" ​ C中引入了一个新的语言特性——引用(&)&#xff0c;它表示某一对象的别名&#xff0c;对象与该对象的引用都是指向统一地址。那么我们就来看看关于引用的一些知识点吧&#x1f9d0; 特性 引用在定义时必须初始化一个变量可以有多个引用引…

STM32Cube高效开发教程<高级篇><FreeRTOS>(二)-----FreeRTOS的文件组成和基本原理

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(高级篇)》&#xff0c;有意向的读者可以购买正版书籍辅助学习&#xff0c;本书籍由王维波老师、鄢志丹老师、王…

MinIO:开源对象存储解决方案的领先者

MinIO:开源对象存储解决方案的领先者 MinIO 是一款开源的对象存储系统&#xff0c;致力于提供高性能、可伸缩、安全的数据存储解决方案。 官方解释&#xff1a;MinIO 是一个基于Apache License v2。0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适…

什么是T0策略?有没有可以持仓自动做T的策略软件?

​​行情低迷&#xff0c;持仓被套&#xff0c;不想被动等待&#xff1f;长期持股&#xff0c;想要增厚持仓收益&#xff1f;有没有可以自动做T的工具或者策略&#xff1f;日内T0交易&#xff0c;做到降低持仓成本&#xff0c;优化收益预期。 什么是T0策略&#xff1f; 可以提…

SpringBoot之内容协商

现象演示 假设有一个需求是根据终端的不同&#xff0c;返回不同形式的数据&#xff0c;比如 PC 端需要以 HTML 格式返回数据&#xff0c;APP、小程序端需要以 JSON 格式返回数据。这时我们是 coding 几个相似的接口&#xff1f;还是在一个接口里面做复杂判断处理&#xff1f;两…

7.8作业

一、思维导图 二、 1】按值修改 2】按值查找&#xff0c;返回当前节点的地址 &#xff08;先不考虑重复&#xff0c;如果有重复&#xff0c;返回第一个&#xff09; 3】反转 4】销毁链表 //按值修改 int value_change(linklistptr H,datatype e,int value) {if(HNULL||empty(H…