【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.mzph.cn/news/869378.shtml

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

相关文章

[linux] 如何优雅的用vim阅读jsonl文件

使用 jq 格式化 JSON 假设你已经安装了 jq&#xff0c;你可以在Vim中运行以下命令来格式化JSON数据&#xff1a; :%!jq . 这样会使JSON数据变得更具可读性。 安装Vim的JSON插件 你也可以使用Vim插件来增强对JSON文件的支持和格式化功能。以下是一些你可以使用的插件&#…

Linux——多线程(四)

前言 这是之前基于阻塞队列的生产消费模型中Enqueue的代码 void Enqueue(const T &in) // 生产者用的接口{pthread_mutex_lock(&_mutex);while(IsFull())//判断队列是否已经满了{pthread_cond_wait(&_product_cond, &_mutex); //满的时候就在此情况下等待// 1.…

C++中的模板(一)

首先&#xff0c;我们做一个简单的假设&#xff1a;假如现在你有穿越回古代的机会&#xff0c;然而你在古代的身份是曹植的管家&#xff0c;这天曹植写了一首《洛神赋》&#xff0c;他命令你把这首诗广泛的传播出去&#xff0c;那么在当时的技术条件下&#xff0c;你只能先制作…

自定义刷题工具-python实现

背景&#xff1a; 最近想要刷题&#xff0c;虽然目前有很多成熟的软件&#xff0c;网站。但是能够支持自定义的导入题库的非常少&#xff0c;或者是要么让你开会员&#xff0c;而直接百度题库的话&#xff0c;正确答案就摆在你一眼能看见的地方&#xff0c;看的时候总觉得自己…

Gymnasium 借游戏来学习人工智能

既然有了免费的linux系统GPU&#xff0c;干脆演示一下使用drivecolab套件来训练模型。 !apt-get install -y build-essential swig !pip install box2d-py !pip install gymnasium[all] !pip install gymnasium[atari] gymnasium[accept-rom-license] !pip install stable_bas…

dify/api/models/task.py文件中的数据表

源码位置&#xff1a;dify/api/models/task.py CeleryTask 表结构 字段英文名数据类型字段中文名字备注idIntegerID自增主键&#xff0c;任务ID序列task_idString任务ID唯一任务标识statusString状态默认值为 PENDINGresultPickleType结果可为空date_doneDateTime完成日期默认…

OJ-0709

示例&#xff1a; 输入&#xff1a; 5 100 10 10 20 30 40 50 3 4 5 6 10 20 30 20 40 30 输出&#xff1a; 0 30 0 40 0import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int number scanner…

项目收获总结--Redis的知识收获

一、概述 最近几天公司项目开发上线完成&#xff0c;做个收获总结吧~ 今天记录Redis的收获和提升。 二、Redis异步队列 Redis做异步队列一般使用 list 结构作为队列&#xff0c;rpush 生产消息&#xff0c;lpop 消费消息。当 lpop 没有消息的时候&#xff0c;要适当sleep再…

2024.7.9总结(找对象的逻辑)

今天口语表达训练5分钟&#xff0c;阅读1h,然后电脑坏了&#xff0c;学python计划估计是完不成了。 然后&#xff0c;今天想聊聊毕业后要不开的两件事&#xff0c;工作和找对象。事业是前期最应该关注和重视的&#xff0c;但找对象结婚关乎后半生的幸福&#xff0c;也不能不做…

SSL证书到期自动巡检脚本-推送钉钉告警

1. 编写SSL证书巡检脚本 cat /hao/batch_check_ssl_expire.sh #!/bin/bash# 域名列表文件绝对路径 domains_file"/hao/domains.txt"#钉钉webhook webhook_url"https://oapi.dingtalk.com/robot/send?access_token99999999999999999999999999999999999999999…

深度学习pytorch多机多卡网络配置桥接方法

1 安装pdsh&#xff08;Parallel Distributed Shell&#xff09; sudo apt install pdsh sudo -s # 切换超级用户身份 …

oracle查询出表中某几个字段值不唯一的数据

假设有一张学生表&#xff0c;建表语句如下&#xff1a; --学生 student表 create table student( sno varchar2(10) primary key, sname varchar2(20), sage number(2), ssex varchar2(5), birthday date );现计划创建唯一索引&#xff08;sno&#xff0c;sname&#xff09;&…

决策树构建精要:算法步骤与实现细节

决策树构建&#xff1a;算法流程与步骤 决策树是一种强大的机器学习算法&#xff0c;用于分类和回归问题。下面将详细介绍决策树的构建流程和具体步骤&#xff0c;帮助您理解并实现决策树算法。 1. 算法流程 决策树的构建流程可以概括为以下几个主要步骤&#xff1a; 特征选…

如何查看Impala集群的状态和日志

查看Impala集群状态 使用Impala Shell 登录到任何集群节点&#xff0c;通过Impala Shell可以查询集群状态。执行命令 invalidate metadata; 可以强制Impala重新加载元数据&#xff0c;有助于识别任何元数据同步问题。此外&#xff0c;可以运行简单的SQL查询&#xff08;如 SEL…

MATLAB备赛资源库(1)建模指令

一、介绍 MATLAB&#xff08;Matrix Laboratory&#xff09;是一种强大的数值计算环境和编程语言&#xff0c;特别设计用于科学计算、数据分析和工程应用。 二、使用 数学建模使用MATLAB通常涉及以下几个方面&#xff1a; 1. **数据处理与预处理**&#xff1a; - 导入和处理…

Redis 中的跳表(Skip List)

Redis 中的跳表&#xff08;Skip List&#xff09;是一种用于实现有序集合&#xff08;Sorted Set&#xff09;的数据结构。跳表是一种非平衡的、概率性的数据结构&#xff0c;它提供了与平衡树类似的性能&#xff0c;但在实现上更简单&#xff0c;通常更容易理解和编码。跳表的…

模型计算量 MAC/FLOPs 的手动统计方法

文章目录 简介背景为什么理解神经网络中的MAC和FLOPs很重要&#xff1f;资源效率内存效率能耗功耗效率 模型优化性能基准研究与发展 FLOPs 和 MACs 定义1. 全连接层 FLOPs 计算步骤 1&#xff1a;识别层参数步骤 2&#xff1a;计算 FLOPs 和 MACs步骤 3&#xff1a;总结结果使用…

行列视(RCV)是否支持批量共享和自定义共享设置,以提高共享效率?

行列视&#xff08;RCV&#xff09;确实支持批量共享和自定义共享设置&#xff0c;以提高共享效率。以下是根据参考文章信息&#xff0c;对RCV在共享功能方面的详细说明&#xff1a; 1. 批量共享&#xff1a; - RCV系统支持大规模数据或报表的共享&#xff0c;这意味着用户可以…

Echarts实现github提交记录图

最近改个人博客&#xff0c;看了github的提交记录&#xff0c;是真觉得好看。可以移植到自己的博客上做文章统计 效果如下 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf-8"> …

240709_昇思学习打卡-Day21-文本解码原理--以MindNLP为例

240709_昇思学习打卡-Day21-文本解码原理–以MindNLP为例 今天做根据前文预测下一个单词&#xff0c;仅作简单记录及注释。 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序列&#x1d447;: 时间步当生成EOS标签时&a…