当前位置: 首页 > news >正文

【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打开文件,输入你动态库文件路径,然后退出保存即可.

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

相关文章:

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

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

Vue框架引入

vue简介 1.1.vue是什么?Vue官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ vue是一套构建用户界面的渐进式javascript框架 构建用户界面:将我们手里拿到的数据通过某种办法变成用户可以看见的界面前端工程师的职责:就是在合适的时候发出合适的请求,然后…...

贝叶斯估计(1):期末大乱炖

写在前面&#xff01; 1 先验分布和后验分布 三种信息&#xff1a;总体信息、样本信息、先验信息 总体信息&#xff1a;“总体是正态分布”&#xff1b;样本信息&#xff1a;总体抽取的样本提供的信息&#xff0c;是最新鲜的信息&#xff1b;先验信息&#xff1a;在抽样之前就…...

电脑找回彻底删除文件?四个实测效果的方法【一键找回】

电脑数据删除了还能恢复吗&#xff1f;可以的&#xff0c;只要我们及时撤销上一步删除操作&#xff0c;还是有几率找回彻底删除文件。 当我们的电脑文件被彻底删除后&#xff0c;尽管恢复的成功率可能受到多种因素的影响&#xff0c;但仍有几种方法可以尝试找回这些文件。本文整…...

java开发报错

查了一下啊。...

基于python 的动态虚拟主机

内容动态&#xff0c;内容通过程序的执行结果返回。 通过编写脚本&#xff0c;完成配置&#xff0c;实现访问页面返回Hello World。 实现步骤&#xff1a; 1、安装python模块 dnf install python3-mod_wsgi 2、编写脚本 在/var/www/cgi-bin/目录下编写脚本&#xff1a; vim…...

绝地求生PUBG没有开始游戏按钮的解决办法

绝地求生是一款特别热门的战术竞技型射击类游戏&#xff0c;游戏中玩家需要在游戏地图上收集各种资源&#xff0c;并在不断缩小的安全区域内持武器对抗其他玩家&#xff0c;让自己生存到最后。当游戏最后场上只剩下一支队伍的时候即可获得游戏胜利。然而一些玩家在游玩绝地求生…...

开始尝试从0写一个项目--前端(一)

基础项目构建 创建VUE初始工程 确保自己下载了node.js和npm node -v //查看node.js的版本 npm -v //查看npm的版本 npm i vue/cli -g //安装VUE CLI 创建 以管理员身份运行 输入&#xff1a;vue ui 就会进入 点击创建 自定义项目名字&#xff0c;选择npm管理 结…...

【Java探索之旅】多态:向上下转型、多态优缺点、构造函数陷阱

文章目录 &#x1f4d1;前言一、向上转型和向下转型1.1 向上转型1.2 向下转型 二、多态的优缺点2.1 多态优点2.2 多态缺陷 三、避免避免构造方法中调用重写的方法四、好的习惯&#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;向上转型和向下转型是常用…...

Linux上web服务器搭建(Apache、Nginx)

第五章 web服务器 第一节 DNS&#xff1a;对域名进行解析&#xff0c;查询对应的地址 1.1 web服务器简介 www是world wide web的缩写&#xff0c;也就是全球信息广播的意思 1.2.网址及HTTP简介 web服务器提供的这些数据大部分都是文件&#xff0c;那么我们需要在服务器端…...

Django QuerySet对象,exclude()方法

模型参考上一章内容&#xff1a; Django QuerySet对象&#xff0c;filter()方法-CSDN博客 exclude()方法&#xff0c;用于排除符合条件的数据。 1&#xff0c;添加视图函数 Test/app11/views.py from django.shortcuts import render from .models import Postdef index(re…...

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…...

Go bufio包

bufio包&#xff1a; 带缓冲的I/O操作&#xff0c; 减少系统调用次数&#xff0c; 读取文件、网络数据。 bufio包 是什么 bufio 包是 Go 标准库中的一个非常有用的包&#xff0c;用于提供带缓冲的 I/O 操作。它通过缓冲来提高读取和写入的效率&#xff0c;可以有效减少系统调用…...

C++ 类和对象 拷贝构造函数

一 拷贝构造函数的概念&#xff1a; 拷贝构造函数是一种特殊的构造函数&#xff0c;用于创建一个对象是另一个对象的副本。当需要用一个已存在的对象来初始化一个新对象时&#xff0c;或者将对象传递给函数或从函数返回对象时&#xff0c;会调用拷贝构造函数。 二 拷贝构造函…...

C# —— Math对象

Math 数学类 提供了一些相关数学计算的属性和方法、四舍五入、向上求整、向下求整、开平方&#xff0c;几次方 最大值和最小值 sin cos 绝对值 方法 1.Math 常用的字段 Math.PI double x 2 * 180 / Math.PI; Console.WriteLine(x); 2 Math.Abs() 求绝对值 int a -3; Con…...

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…...

1-3分钟爆款视频素材在哪找啊?这9个热门爆款素材网站分享给你

在如今快节奏的时代&#xff0c;短视频已成为吸引观众注意力的黄金手段。然而&#xff0c;要制作出1-3分钟的爆款视频&#xff0c;除了创意和剪辑技巧外&#xff0c;选择合适的素材至关重要。那么&#xff0c;哪里可以找到那些能让你的视频脱颖而出的爆款素材呢&#xff1f;不用…...

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一&#xff0e;背景介绍 当今高度数字化和智能化的工业领域&#xff0c;对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来&#xff0c;工业生产过程正经历着前所未有的变革&#xff0c;从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…...

【vite创建项目】

搭建vue3tsvitepinia框架 一、安装vite并创建项目1、用vite构建项目2、配置vite3、找不到模块 “path“ 或其相对应的类型声明。 二、安装element-plus1、安装element-plus2、引入框架 三、安装sass sass-loader1、安装sass 四、安装vue-router-next 路由1、安装vue-router42搭…...

最优化方法 运筹学【】

1.无约束 常用公式 线搜索准则&#xff1a;求步长 精确线搜索&#xff08;argmin&#xff09; 最速下降&#xff1a;sd&#xff1a;线性收敛 2.算法 SD dk&#xff1a;付梯度-g newton dk&#xff1a;Gkd-g 二阶收敛&#xff0c;步长为1 阻尼牛顿&#xff1a;步长用先搜…...

大厂Agent开发工程师亲授!这份核心技术学习路线助你轻松拿下高薪Offer!

结合个人实际的工作内容和招聘市场对于Agent开发的能力要求&#xff08;阅读汇总了大量大厂的Agent开发招聘面经&#xff09;&#xff0c;我总结了一份核心技术学习路线。 这个学习路线由浅到深&#xff0c;基本覆盖了现在大厂对于Agent开发的技术要求&#xff0c;技术栈完全可…...

Pixel Language Portal快速上手:无需Python基础的Streamlit镜像开箱即用

Pixel Language Portal快速上手&#xff1a;无需Python基础的Streamlit镜像开箱即用 1. 什么是Pixel Language Portal&#xff1f; Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于腾讯Hunyuan-MT-7B核心引擎构建的创新翻译工具。它最大的特点是…...

终极指南:NanoVG渲染管线深度解析与抗锯齿技术实战

终极指南&#xff1a;NanoVG渲染管线深度解析与抗锯齿技术实战 【免费下载链接】nanovg Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations. 项目地址: https://gitcode.com/gh_mirrors/na/nanovg NanoVG是一款基于OpenGL的轻量级抗锯…...

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断方法探索

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断 首先&#xff0c;利用格拉姆角场差(GADF)时频分辨率高、可以深度反映时间序列内在结构和关系的特点&#xff0c;对采集到的一维故障数据信号转为二维图像&#xff0c;得到图像后并将图像进行降维处理&#xff1b;然后&#xff0c;将第…...

【Matlab】MATLAB教程:图形句柄;案例:h=plot(x,y);应用:控制图形属性

MATLAB教程:图形句柄;案例:h=plot(x,y);应用:控制图形属性 在MATLAB数据可视化、实验报告绘图、工程结果展示等场景中,仅仅通过plot函数绘制基础图形远远不够。实际科研与工程应用中,往往需要精准调整图形的线条样式、颜色、标记点、坐标轴、图例等属性,让图形更清晰、…...

SDXL 1.0电影级绘图工坊惊艳案例:电影质感风景图动态范围实测

SDXL 1.0电影级绘图工坊惊艳案例&#xff1a;电影质感风景图动态范围实测 1. 项目简介 SDXL 1.0电影级绘图工坊是基于Stable Diffusion XL Base 1.0模型深度优化的AI绘图工具&#xff0c;专门为RTX 4090显卡的24G大显存进行了极致性能调优。与常规部署方式不同&#xff0c;这…...

手把手教你用PyTorch 2.0复现风源AI气象模型(附GitHub源码解读)

手把手教你用PyTorch 2.0复现风源AI气象模型&#xff08;附GitHub源码解读&#xff09; 气象预测正经历从传统数值模拟到AI驱动的范式转移。本文将带您深入风源模型的技术内核——一个融合卫星遥感与深度学习的混合架构&#xff0c;通过PyTorch 2.0实现从数据预处理到模型推理的…...

GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化

GLM-4.1V-9B-Base模型微调入门&#xff1a;使用accelerate库进行高效参数优化 1. 引言 想为特定业务场景定制一个强大的多模态AI模型&#xff1f;GLM-4.1V-9B-Base作为支持图文理解与生成的大模型&#xff0c;通过微调可以快速适配各种下游任务。本文将带你从零开始&#xff…...

SAP BAPI实战指南:核心模块高频接口速查与应用解析

1. SAP BAPI入门&#xff1a;为什么开发者需要这份速查手册 第一次接触SAP BAPI时&#xff0c;我盯着满屏的接口文档差点崩溃——光是FICO模块就有二十多个常用BAPI&#xff0c;每个接口的参数列表长得像毕业论文。后来在项目上踩过几次坑才明白&#xff0c;BAPI的难点不在于技…...

别再死磕状态机了!用Verilog实现I2C主机/从机,这份可综合代码直接拿去用

实战派Verilog I2C实现&#xff1a;模块化设计到上板调试全指南 在FPGA和数字IC开发中&#xff0c;I2C协议因其简洁的两线制接口&#xff08;SCL时钟线和SDA数据线&#xff09;而广受欢迎。但当工程师真正需要在项目中实现I2C功能时&#xff0c;往往会陷入状态机调试的泥潭——…...