【linux】动静态库的使用与制作

本章节是基础IO的的最后一个话题!!

目录

  • 浅谈一下动静态库:
  • 动静态库的制作与使用:
    • 静态库:
      • 怎么办:
        • 方法一:
        • 方法二:
        • 方法三:
        • 方法四:
      • 是什么:
      • 为什么:
    • 动态库:

浅谈一下动静态库:

我们有没有用过库?
答案是一定的,我们在使用printf,stl容器…等等函数都是在使用库,
不然的话我们在使用这些东西时,明明你自己没有实现,程序缺依然能执行呢?

都是因为库的存在!

既然知道了库的存在,那我们肯定要见一见。
在这里插入图片描述

ldd命令可以查看可执行程序依赖的库,=>后指的是库的路径。
显示一下库的命令,可以看到,这些都是我们的库。
在这里插入图片描述
那么知道的库的存在总得知道库的名字吧
Linux
动态库:.so
静态库:.a

windows
动态库:.dll
静态库:.lib

动静态库的制作与使用:

当然是要先制作再使用啦,突然想起来小学题找语病~

我们先来讲解静态库,因为他简单。
将会分为3个步骤来走

  1. 怎么办
  2. 是什么
  3. 怎么办

好吧,与平时的三段论有些不同,但是无伤大雅。

静态库:

怎么办:

怎么办也就是制作,这里我们将会一步一步的带着大家走,会由一个例子来体现。

假设现在我们有两个你自己实现的库。
在这里插入图片描述
其中math中有add方法;string中有strcmp方法。

再假设我们现在要给你的室友抄C语言作业(实现库函数并写出在main函数中展示),但是你不能把你的原码给她,否则就谈不清谁抄的谁了。
在这里插入图片描述

方法一:

于是我们选择将源文件编译形成的.o文件给他,
直接gcc -c目标文件即可生成同名.o文件,不知道为啥这样做的的可以点击gcc与g++的认识
在这里插入图片描述
之后我们将这两个.o文件与头文件给他。
因为头文件就相当于一个使用方法。

在这里插入图片描述
那么我们的室友就写了一个main函数。
在这里插入图片描述
进行编译:
在这里插入图片描述
结果:
在这里插入图片描述
但是这样太挫了,如果头文件,.o文件太多就容易出错。

从这里我们就可以初见端倪,库的本质就是将.o文件打包。

方法二:

我们将.o文件进行打包给你的室友:
但并不是zip,tgz等打包,而是ar
他是一个归档工具,这里我们不需要管,只知道他与库的打包关系密切即可。用到的选项为rc,rc表示(replace and create)。

在这里插入图片描述
为什么起这么一个名字,别忘了我们是在制作静态库,库真正的名字是去掉前缀与后缀,真正的名字是myc(我的C库)
于是我们将libmyc.a库给室友进行编译。
在这里插入图片描述
运行依旧正确。
在这里插入图片描述
但这样依旧太矬了,我们在实际应用时都不会采取这种方法。

方法三:

先构成一个目录,包含头文件与库文件。
在这里插入图片描述
再将这个目录给你的舍友
将目录中的内容安装到系统。

在这里插入图片描述
在这里插入图片描述
随后即可像正常库文件使用,但是有一个注意点,我们的gcc/g++只认识C/C++的标准库,而mylib.a可以理解为第三方库。
故需要告诉编译器我们要链接的库
在这里插入图片描述
但是这种方法会污染库,我们是10分有9分的不愿意的!
不要忘记卸载你安装的库哦!

方法四:

在当前目录直接使用:
在这里插入图片描述
-I是指定你的头文件路径,-L是指定你库所在路径,-l是链接所在路径库的名字。

至于为什么我们为什么不用指定头文件呢,因为我们在.c文件中已经包含了。

是什么:

本质是一堆.o文件的打包

为什么:

提高效率!

开始动态库之前还要再说一个东西,我们之前学习时,说静态库是使用-static才可以生成,但是为什么我们并没有使用也说是静态库呢?

gcc/g++默认是动态链接的,但是如果没有动态库就会勉强使用需要你静态库的部分,其他能使用动态库还是使用动态库。

加上-static是强制全部使用静态库。

动态库:

我们的静态库用到了ar进行对静态库的打包,那动态库需要什么命令?

我们已经说过,打包的本质就是.o文件的打包,那我们的动态库也是需要.o文件,可是这个有一些不一样,需要

答案是编译器自己就可以完成!因为动态库的比率甚至高达90%,使用的是非常频繁啊。

持续更新…

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

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

相关文章

linux驱动开发中time_before的用法

time_before是一个在Linux内核编程中常用的宏&#xff0c;用于比较两个ktime_t类型的时间值&#xff0c;判断第一个时间值是否小于第二个时间值。 以下是time_before的一个简单示例&#xff1a; #include <linux/kernel.h> #include <linux/ktime.h>int main() {k…

YOLOv8-pose针对视频实时提取打印对应关节点序号及坐标

因为我在找如何提取YOLOv8-pose的关键点的时候&#xff0c;大多都是针对静态图像&#xff0c;视频直接套用不太行&#xff0c;因此就改进了一下&#xff0c;如下&#xff1a; 初步代码&#xff1a; import torch # 导入PyTorch库 import cv2 as cv # 导入OpenCV库并重命名为…

同态加密原理解析

目录 1.数学介绍2.使用多项式环进行加密2.1 私钥和公钥的产生2.2 加密2.3 解密 3.同态计算3.1 同态加法3.2 同态乘法 1.数学介绍 同态加密方案基于一个难以计算的问题Ring Learning with Errorsred。这些方案中的数据在加密和未加密时都用多项式表示。 这里举一个简单的多项式…

主打熟人双向社交,UXLINK 如何用群组打造超强社交生态

社交&#xff0c;作为最强 Web3 流量入口 Web2 世界里&#xff0c;社交产品总是最具想象力。全球使用 Facebook 系列产品的日活用户&#xff08;DAP&#xff09;均值近 30 亿人&#xff0c;占全球人口的 1/3。然而&#xff0c;加密货币用户仅约有 4.2 亿&#xff0c;占全球人口…

C++ 核心编程(1)

c面向对象编程 1.内存分区模型 程序运行前为代码区和全局区。程序运行后才有栈区和堆区。。 1.1 程序运行前 #include<iostream> #include <bits/stdc.h> using namespace std; /*全局区全局变量、静态变量、常量 */ //全局变量 int g_1 20; int g_2 30; //const…

Reactjs数据篇

参考代码&#xff1a;GitHub - leellun/zhiqu-web-test2 1 通过createAction创建Action做数据传递 在 Redux 中定义动作的常用方法是分别声明一个动作类型常量和一个动作创建器函数来构造该类型的动作。 store/action.ts import { createAction } from "reduxjs/toolk…

力扣刷题学习(跟随视频学着刷)

使用入门 视频链接 【手把手带你刷Leetcode力扣&#xff5c;各个击破数据结构和算法&#xff5c;大厂面试必备技能【已完结】-哔哩哔哩】 https://b23.tv/vIcRT61 时空复杂度 时间&#xff1a; 空间&#xff1a;主要有O(1)和O(n)两种&#xff0c;只用计算开辟的内存&#xff…

三种类的免费SSL证书

目前主流的三种域名证书&#xff1a;单域名证书、多域名证书、通配符泛域名证书。 这三种类型的证书根据用户域名的不同情况&#xff0c;应用场景也大不相同。 单域名证书应用场景&#xff1a; 针对于有且只有一个单独域名的单位&#xff0c;使用单域名证书是刚好能够满足需求…

Linux 高级网络设置

1. rp_filter 逆向路由检查 rp_filter &#xff08;Reverse Path Filtering&#xff09;参数定义了网卡对接收到的数据包进行反向路由验证的规则。他有三个值&#xff0c;0、1、2&#xff0c;具体含意如下&#xff1a; 0&#xff1a;关闭反向路由校验1&#xff1a;开启严格的…

使用脚本定时备份MySql数据库文件

如果mysql不在环境变量中&#xff0c;请先将mysql放入环境变量 #将mysql添加进环境变量中 export PATH$PATH:/usr/local/mysql/bin/#重新加载配置文件 source /etc/profile新建一个脚本 touch backup_all_databases.sh 脚本内容&#xff1a; #!/bin/bash # MySQL登录信息 …

DRF学习之三大认证

一、认证 1、自定义认证 在前面说的 APIView 中封装了三大认证&#xff0c;分别为认证、权限、频率。认证即登录认证&#xff0c;权限表示该用户是否有权限访问接口&#xff0c;频率表示用户指定时间内能访问接口的次数。整个请求最开始的也是认证。 &#xff08;1&#xff…

VUE 打包后 动态修改 后台服务器地址

使用的是第三方 continew-admin 项目 在 continew-admin-ui 项目中 添加 config.json 到public 目录下 {"baseURL": "http://localhost:8000" } 在 request.ts 文件中 async function fetchConfig() {const response await fetch(/config.json);con…

【JavaEE网络】TCP/IP协议:细节与应用

目录 TCP/IP协议协议格式传输层重点协议UDP协议UDP协议端格式 UDP的特点TCP协议TCP协议端格式 TCP的特点 TCP/IP协议 协议格式 应用层&#xff08;后端开发必知必会&#xff09;&#xff1a;这一层也有很多现成的协议&#xff08;后面还会重点介绍HTTP协议&#xff0c;这是做…

SysY 语言

SysY 语言是编译系统设计赛 要实现的编程语言。由 C 语言的一个子集扩展 而成。 每个 SysY 程序的源码存储在一个扩展名为 sy 的文件中。该文件中有且仅 有一个名为 main 的主函数定义&#xff0c;还可以包含若干全局变量声明、常量声明和其 他函数定义。 SysY 语言支持 int/…

jenkins自动化举例

使用 Jenkins 可以显著提高工作效率&#xff1a; 1. **自动化构建**&#xff1a; - 假设您是一个开发人员&#xff0c;需要频繁地编译和测试代码。手动执行这些任务可能会非常耗时。使用 Jenkins&#xff0c;您可以设置自动化构建流程&#xff0c;每当您提交新代码时&#…

RabbitMQ:消息队列的卓越之选

在当今高度互联和数据驱动的世界中&#xff0c;消息队列扮演着至关重要的角色。RabbitMQ&#xff0c;作为其中的佼佼者&#xff0c;以其高效、可靠和灵活的特性&#xff0c;赢得了众多开发者和企业的青睐。本文将深入探讨RabbitMQ的基本概念、核心特性、应用场景以及最佳实践&a…

探秘STM32MDK:编译过程与文件类型解析

探秘STM32MDK&#xff1a;编译过程与文件类型解析 在嵌入式系统开发中&#xff0c;STM32系列微控制器是广泛应用的选择之一&#xff0c;而Keil MDK&#xff08;Microcontroller Development Kit&#xff09;则是一款常用的开发工具套件。了解STM32MDK的编译过程和文件类型对于…

命令执行漏洞【2】vulhub远程命令执行漏洞复现

1.vulhub安装启动靶场环境 &#xff08;1&#xff09;s2-061开启靶场 &#xff08;2&#xff09;s2-059开启靶场 2.漏洞复现 &#xff08;1&#xff09;s2-061漏洞复现 github获取漏洞利用工具 开始利用 &#xff08;2&#xff09;s2-059漏洞复现 在linux特有临时目录/tmp下…

多线程并发和进程通信模拟

一、实验目的&#xff1a; 通过编写多线程并发和进程通信的模拟代码&#xff0c;加深对多线程编程和进程通信的理解。学习如何使用Java中的多线程和管道流来实现并发执行和进程间通信。掌握多线程的基本概念和使用方法&#xff0c;以及进程通信的实现方式。 实验设备与实验环境…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…