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

Linux环境下静态库和动态库的实现

Linux 环境下静态库和动态库的实现

在软件开发中,库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段,用于提高开发效率和代码质量。在Linux系统中,库分为静态库和动态库两种。本文将介绍它们的实现方式,结合C语言代码进行说明,并详细解释其原理和使用方法。

静态库的实现

目录结构

静态库的目录结构如下(同理动态库也如此):

mylib/
├── include/
│   └── math_functions.h
├── lib/
│   └── libmath.a
└── main.c

什么是静态库

静态库(Static Library)是将多个目标文件(.o 文件)打包到一个单独的文件(通常以 .a 为扩展名)中,链接时将库的代码复制到最终的可执行文件中。

创建静态库

我们通过以下步骤创建一个静态库:

  1. 编写一个简单的C语言程序,包含一些需要复用的函数。
  2. 编译成目标文件(.o 文件)。
  3. 使用 ar 工具将目标文件打包成静态库。

以下是示例代码:

math_functions.h

#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_Hint add(int a, int b);
int subtract(int a, int b);#endif

math_functions.c

#include "math_functions.h"// 加法函数
int add(int a, int b) {return a + b;
}// 减法函数
int subtract(int a, int b) {return a - b;
}

编译为目标文件:

gcc -c math_functions.c -o math_functions.o
# -c:仅编译源文件为目标文件,不链接

使用 ar 工具创建静态库:

ar rcs libmath.a math_functions.o
# r:将目标文件添加到库中
# c:创建一个新的库文件
# s:索引库文件,提升访问效率

将头文件和库文件组织到目录结构中:

mkdir -p mylib/include mylib/lib
mv math_functions.h mylib/include/
mv libmath.a mylib/lib/

使用静态库

创建一个使用静态库的程序:

main.c

#include <stdio.h>
#include "math_functions.h"  // 包含头文件int main() {printf("5 + 3 = %d\n", add(5, 3));printf("5 - 3 = %d\n", subtract(5, 3));return 0;
}

编译并链接静态库:

gcc main.c -I./mylib/include -L./mylib/lib -lmath -o static_example
# -I:指定头文件路径
# -L:指定库文件路径
# -l:链接指定的库(去掉前缀lib和后缀.a)

运行程序:

./static_example

使用Makefile管理静态库

创建一个 Makefile 文件:

# 编译器
CC = gcc
# 静态库工具
AR = ar
# 编译选项
CFLAGS = -I./mylib/include
# 链接选项
LDFLAGS = -L./mylib/lib
# 使用的库
LIBS = -lmathall: static_example# 目标1:生成静态库
mylib/lib/libmath.a: mylib/include/math_functions.h mylib/include/math_functions.c$(CC) -c mylib/include/math_functions.c -o math_functions.o$(AR) rcs mylib/lib/libmath.a math_functions.o# 目标2:生成可执行文件
static_example: main.c mylib/lib/libmath.a$(CC) main.c $(CFLAGS) $(LDFLAGS) $(LIBS) -o static_example# 清理
clean:rm -f *.o mylib/lib/libmath.a static_example

使用 make 命令自动化构建和清理:

make
./static_example
make clean

静态库的特点

  • 优点
    • 链接后无需依赖外部库,部署简单。
    • 运行效率高。
  • 缺点
    • 可执行文件体积较大。
    • 库更新时需要重新编译应用程序。

动态库的实现

目录结构

动态库的目录结构如下:

mylib/
├── include/
│   └── math_functions.h
├── lib/
│   └── libmath.so
└── main.c

什么是动态库

动态库(Dynamic Library)在程序运行时被加载到内存中,通常以 .so 为扩展名。与静态库不同,动态库不被嵌入到可执行文件中,而是以共享方式供多个程序使用。

创建动态库

  1. 编写需要共享的函数代码。
  2. 使用 -fPIC 选项生成位置无关代码。
  3. 使用 gcc -shared 创建动态库。

示例代码与静态库相同,这里直接展示动态库的生成:

编译生成目标文件:

gcc -c -fPIC math_functions.c -o math_functions.o
# -c:仅编译源文件为目标文件,不链接
# -fPIC:生成与内存地址无关的代码,便于动态加载

创建动态库:

gcc -shared math_functions.o -o libmath.so
# -shared:生成动态库文件

将库文件组织到目录结构中:

mv libmath.so mylib/lib/

使用动态库

方法1:临时指定库路径
gcc main.c -I./mylib/include -L./mylib/lib -lmath -o dynamic_example
export LD_LIBRARY_PATH=./mylib/lib:$LD_LIBRARY_PATH
./dynamic_example
  • export LD_LIBRARY_PATH:临时指定动态库路径。
方法2:将动态库复制到系统默认目录

将动态库复制到系统默认路径,例如 /usr/lib//usr/local/lib/

sudo cp mylib/lib/libmath.so /usr/lib/

运行程序时无需手动设置路径。

方法3:创建软链接

创建指向动态库的软链接:

sudo ln -s /path/to/mylib/lib/libmath.so /usr/lib/libmath.so
方法4:在 /etc/ld.so.conf.d/ 下添加配置文件

创建一个新的配置文件,例如 mylib.conf,内容为动态库的路径:

echo "/path/to/mylib/lib" | sudo tee /etc/ld.so.conf.d/mylib.conf
sudo ldconfig

运行程序时无需手动设置路径。

使用Makefile管理动态库

创建一个 Makefile 文件:

# 编译器
CC = gcc
# 编译选项
CFLAGS = -fPIC -I./mylib/include
# 链接选项
LDFLAGS = -L./mylib/lib
# 使用的库
LIBS = -lmathall: dynamic_example# 目标1:生成动态库
mylib/lib/libmath.so: mylib/include/math_functions.h mylib/include/math_functions.c$(CC) -c $(CFLAGS) mylib/include/math_functions.c -o math_functions.o$(CC) -shared math_functions.o -o mylib/lib/libmath.so# 设置LD_LIBRARY_PATH
export_path:export LD_LIBRARY_PATH=./mylib/lib:$(LD_LIBRARY_PATH)# 目标2:生成可执行文件
dynamic_example: main.c mylib/lib/libmath.so$(CC) main.c $(CFLAGS) $(LDFLAGS) $(LIBS) -o dynamic_example# 清理
clean:rm -f *.o mylib/lib/libmath.so dynamic_example

动态库的特点

  • 优点
    • 多个程序可以共享同一个动态库文件,而不需要在每个程序中都包含库代码。因此,动态库使得磁盘空间的使用更加高效,尤其是在多个应用程序依赖同一个库时。
    • 动态库可以在不重新编译应用程序的情况下进行更新。只需替换系统中的动态库文件,所有依赖该库的程序都能自动使用新版本的库。
    • 动态库是在程序运行时加载的,系统可以根据需要加载和卸载库,从而提高内存使用的灵活性,尤其适合大规模的应用程序或需要频繁更新的程序。
    • 与静态库相比,动态库不嵌入可执行文件中,因此生成的可执行文件通常较小。这对于需要部署到多个设备或网络传输的程序非常重要。
  • 缺点
    • 动态库需要在运行时加载,这意味着应用程序必须依赖系统上正确版本的库文件。如果缺少某个库或版本不匹配,程序可能无法正常运行,导致“库未找到”或“版本冲突”等问题。这要求开发者和用户必须确保库的正确安装和配置。
    • 虽然动态库在内存和磁盘空间上节省了资源,但它们在加载和链接时会带来一定的性能开销。每次程序启动时,操作系统需要查找和加载相应的动态库,且在程序执行期间,动态链接可能导致额外的性能消耗。
    • 由于动态库是外部依赖,它们的存在和稳定性对程序的正常运行至关重要。如果动态库被删除、移动或损坏,应用程序就会无法运行,给用户带来不便。

相关文章:

Linux环境下静态库和动态库的实现

Linux 环境下静态库和动态库的实现 在软件开发中&#xff0c;库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段&#xff0c;用于提高开发效率和代码质量。在Linux系统中&#xff0c;库分为静态库和动态库两种。本文将介绍它们的实现方式&#xff0c;结合C语言代…...

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能&#xff0c;选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其&#xff0c;在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换&#xff0c;特别方便。VS文件另…...

Tortoisegit 安装之后没有Add、ignore解决

在本地的仓库文件夹中点击右键&#xff0c;找到Settings&#xff0c; 从General 找到Contex Menu&#xff0c;我的系统是Win11&#xff0c;所以用Win11 Contex Menu 将所需要的操作打勾即可。...

线性代数考研笔记

行列式 背景 分子行列式&#xff1a;求哪个未知数&#xff0c;就把b1&#xff0c;b2放在对应的位置 分母行列式&#xff1a;系数对应写即可 全排列与逆序数 1 3 2&#xff1a;逆序数为1 奇排列 1 2 3&#xff1a;逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…...

C语言带参数的宏定义的相关知识汇总(最常用的形式、带标记分隔符##的形式...)

阅读大型C工程代码时&#xff0c;绕不开带参数的宏定义的阅读&#xff0c;所以有必要强化一下这一块的知识。 01-带参数的宏定义最常用的形式 # define S(a,b) a*b ... ... ... area S(3,2);则在编译预处理时area S(3,2);被展开为&#xff1a; area 3 * 2;02-带标记分隔符…...

cpp编译链接等

一、编译预处理 C程序编译的过程&#xff1a;预处理 -> 编译&#xff08;优化、汇编&#xff09;-> 链接 预处理指令主要有以下三种&#xff1a; 包含头文件&#xff1a;#include 宏定义&#xff1a;#define&#xff08;定义宏&#xff09;、#undef&#xff08;删除宏…...

openbmc sdk09.03 适配(一)

1.说明 本节是根据最新的sdk09.03适配ast2600平台。 sdk下载路径为: https://github.com/AspeedTech-BMC/openbmc可参阅文档: https://blog.csdn.net/wit_yuan/article/details/144613247nfs挂载方法: # mount -o nolock -t nfs serverip:/xx...

JavaScript HTML DOM 实例

JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...

【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题

问题描述 在 Vue.js 项目&#xff0c;当尝试动态更新 <video> 标签的 <source> 元素 src 属性来切换视频时&#xff0c;遇到了一个问题&#xff1a;即使 src 属性已更改&#xff0c;浏览器仍显示旧视频。具体表现为用户选择新视频后&#xff0c;视频区域继续显示之…...

C语言| 二维数字的定义

【二维数组】 二维数组的本质就是一维数组&#xff0c;表现形式上是二维的。 定义一般形式为 类型说明符 数组名[常量表达式][常量表达式]; 举例 int a[2][3]; 定义了一个2行3列的二维数组a&#xff0c;共有6个元素。 元素名字依次是&#xff1a;a[0][0],a[0][1],a[0][…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)—(十)(求解数学中特殊的数)

实战训练1—完全数 问题描述&#xff1a; 数学上的“完全数”是指真因子&#xff08;除了自身以外的约数&#xff09;之和等于它本身的自然数。例如&#xff0c;6的因子是1,2,3&#xff0c;而1236&#xff0c;所以6是完全数。如果一个正整数小于它的所有真因数之和&#xff0…...

【大模型】ChatGPT 数据分析与处理使用详解

目录 一、前言 二、AI 大模型数据分析介绍 2.1 什么是AI数据分析 2.2 AI数据分析与传统数据分析对比 2.2.1 差异分析 2.2.2 优劣势对比 2.3 AI大模型工具数据分析应用场景 三、AI大模型工具数据分析操作实践 3.1 ChatGPT 常用数据分析技巧操作演示 3.1.1 快速生成数据…...

[gcc]常见编译开关

GCC 提供了许多编译开关&#xff08;编译选项&#xff09;&#xff0c;这些开关可以用于控制编译过程的各种方面&#xff0c;如优化级别、调试信息、警告和错误处理等。 以下是一些常见的 GCC 编译开关&#xff1a; -o&#xff1a;指定输出文件名。例如&#xff0c;gcc -o myp…...

iOS实现在collectionView顶部插入数据效果

有时候&#xff0c;我们会遇到这种需求&#xff0c;就是下拉刷新的时候&#xff0c;在 collectionView顶部插入数据&#xff0c;这个时候&#xff0c;需要我们注意 主要有两点 1 关闭隐式动画 由于我们使用insert在collectionView顶部插入数据是有从头部插入的隐式动画的&#…...

GPIO、RCC库函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx); void GPIO_AFIODeInit(void); void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); //输出 读 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,…...

PostgreSQL学习笔记(一):PostgreSQL介绍和安装

目录 概念 PostgreSQL简介 PostgreSQL的关键特性 1. 标准兼容性 2. 扩展性 3. 数据完整性和可靠性 4. 丰富的数据类型 5. 查询能力 6. 事务和并发控制 7. 扩展和插件 8. 跨平台和多语言支持 9. 高可用性和扩展性 常用场景 安装 Linux apt安装 下载安装包安装 客…...

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信&#xff0c;但当我通过USB将手机连接到电脑时&#xff0c;我在电脑上找不到它们。由于我的手机内存已达到限制&#xff0c;并且我想保留短信的纸质版本&#xff0c;您能帮我将短信从摩托罗拉手机导出到计算机吗&#xff1f; 如您所知&…...

矩阵运算提速——玩转opencv::Mat

介绍:用Eigen或opencv::Mat进行矩阵的运算&#xff0c;比用cpp的vector或vector进行矩阵运算要快吗? 使用 Eigen 或 OpenCV 的 cv::Mat 进行矩阵运算通常比使用 std::vector<int> 或 std::vector<double> 更快。这主要有以下几个原因&#xff1a; 优化的底层实现…...

vue请求后端需要哪些问题

在使用 Vue 前端框架请求后端服务时&#xff0c;需要考虑和解决的问题有很多。以下是一个详细的讲解&#xff1a; 1. **API 设计与文档** - **明确 API 端点**&#xff1a;了解后端提供的 API 端点&#xff08;URL&#xff09;&#xff0c;包括资源的路径和操作方法&#xff08…...

QML Image详解

1. 概述 Image 是 QML 中用于显示图片的基本组件。它允许开发者加载和显示各种格式的图像文件&#xff08;如 PNG, JPEG, GIF 等&#xff09;&#xff0c;并提供了多种配置选项来控制图片的显示方式和行为。Image 元素支持各种图像处理功能&#xff0c;比如缩放、裁剪、模糊等…...

Chapter4.1 Coding an LLM architecture

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型&#xff08;LLM&#xff09;&#xff0c;这个模型可以被训练来生…...

Linux 端口知识全解析

Linux 端口知识全解析 在 Linux 系统的网络世界里&#xff0c;端口如同一个个小小的“窗口”&#xff0c;数据的进出都依赖它们有条不紊地运作。理解 Linux 端口知识&#xff0c;无论是对于系统管理员排查网络故障&#xff0c;还是开发者进行网络编程&#xff0c;都至关重要。…...

《Armv8-A virtualization》学习笔记

1.MAIR 的全称是 Memory Attribute Indirection Register。它是ARM架构中的一种寄存器&#xff0c;用于定义内存的属性&#xff0c;并提供一种间接访问内存属性的机制。MAIR寄存器包含多个字段&#xff0c;这些字段指示不同类型内存的属性&#xff0c;例如是否可以缓存、是否为…...

23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算

在每个月发工资后很多人会对未来一个月的花销进行大致的计划&#xff0c;这个行为叫做预算。那么在这篇文章中我们将一起开发预算服务。 一、需求 预算需求就是简单的增删改查&#xff0c;虽然比较简单&#xff0c;但是也有几点需要注意。 编号需求说明1新增预算1. 针对每种…...

DOS攻击的原理和实现 (网络安全)hping3和Slowloris的运用

DoS攻击的原理和实现 DoS攻击&#xff08;Denial of Service Attack&#xff0c;拒绝服务攻击&#xff09;是指通过恶意手段使目标服务器、服务或网络资源无法正常提供服务&#xff0c;从而影响正常用户的访问。DoS攻击通常通过消耗目标系统的资源&#xff08;如带宽、内存、处…...

十三、Vue 过渡和动画

文章目录 一、Vue过渡和动画概述1. 过渡的基本原理2. 动画的基本原理二、使用 CSS 过渡1. 单元素过渡2. 过渡模式in - out 模式out - in 模式三、使用 CSS 动画1. 单元素动画2. 动画结合过渡四、JavaScript 钩子函数实现过渡和动画1. 基本概念2. 示例五、列表过渡1. 基本原理2.…...

Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比

1.Dubbo 负载均衡策略&#xff1f; Dubbo 是一个分布式服务框架&#xff0c;它提供了多种负载均衡策略来分发服务调用。在 Dubbo 中&#xff0c;负载均衡的实现是基于客户端的&#xff0c;即由服务消费者&#xff08;Consumer&#xff09;端决定如何选择服务提供者&#xff08…...

仿生的群体智能算法总结之三(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...

《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》

在科技的前沿&#xff0c;量子比特与人工智能的融合正开启一扇全新的大门。不同类型的量子比特&#xff0c;如超导、离子阱、光量子等&#xff0c;在与人工智能结合时展现出独特的优势与劣势。 超导量子比特 超导量子比特是目前应用较为广泛且研究相对成熟的量子比特类型。它…...

el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割

需求&#xff1a;一个输入框字段需要支持多次输入&#xff0c;最后传输给后台的字段值以逗号分割 解决方案&#xff1a;结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...

机器人领域的一些仿真器

模拟工具和环境对于开发、测试和验证可变形物体操作策略至关重要。这些工具提供了一个受控的虚拟环境&#xff0c;用于评估各种算法和模型的性能&#xff0c;并生成用于训练和测试数据驱动模型的合成数据。 Bullet Physics Library 用于可变形物体模拟的一个流行的物理引擎是 B…...

前端-动画库Lottie 3分钟学会使用

目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...

腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎

在当今数字化时代的汹涌浪潮中&#xff0c;数据已跃升为企业发展的关键要素&#xff0c;其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性&#xff0c;宛如一颗璀璨的明星&#xff0c;在交通、…...

【开源免费】基于SpringBoot+Vue.JS精品在线试题库系统(JAVA毕业设计)

本文项目编号 T 115 &#xff0c;文末自助获取源码 \color{red}{T115&#xff0c;文末自助获取源码} T115&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

c# CodeFirst生成表字段加注释

前置&#xff1a;ORM框架工具使用的FreeSql 背景&#xff1a;开发环境中运行接口&#xff0c;所有的表字段以及备注会自动加上&#xff0c;但是在测试环境时运行就只生成了表&#xff0c;没有把每个字段的注释加上 问题检查&#xff1a; FreeSql CodeFirst 支持将 c# 代码内的注…...

MySQL8.0复制原理和部署配置步骤

1. mysql 主从复制原理 在从库上执行change master to&#xff1b;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作&#xff1b;io_thread通过master.info文件中主库的连接信息去连接主库&#xff1b;连接成…...

Unity热更新文件修改后缀并拷贝到指定路径的工具类

最近在学习Hybrid热更新。每次编译完&#xff0c;需要修改后缀名和拷贝到特定路径覆盖旧文件&#xff0c;就叫AI写了个工具类。现在记录一下&#xff0c;毕竟ai写完还需要修改。 代码如下&#xff0c;放到Assets/Editor/路径下即可。 可根据需求自行改变路径和文件名。 using…...

前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)

学习自掘金文章https://juejin.cn/post/7295169886177918985 该博主的代码基于原生textarea控件和js实现&#xff0c;基于该博主的代码和思路&#xff0c;在vue下实现了相应功能 思路 生成html字符串来实现文字高亮标红效果&#xff0c;但是input输入控件不能渲染html字符串…...

SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点

文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么&#xff1f;三、S价&#xff08;标准价&#xff09;的优势四、S价&#xff08;标准价&#xff09;的劣势五、V价&#xff08;移动平均价&#xff09;的优势六、V价&#xff08;移动平均价&#xff09;的劣势…...

通往O1开源之路

“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发&#xff0c;深入分析了实现类似OpenAI o1模型性能的路线图&#xff0c;聚焦于策略初始化、奖…...

【QT】实现RestFul接口

在这个教程中&#xff0c;我们将介绍如何在 Qt 中使用 QHttpServer 类来创建一个简单的 HTTP 服务器。QHttpServer 是 Qt 6 引入的新类&#xff0c;用于提供 HTTP 服务。这个类非常适合快速开发restful接口。 准备工作 确保你的 Qt 版本是 Qt 6 或更高版本&#xff0c;因为 Q…...

ARP攻击的原理和实现 (网络安全)

ARP攻击的原理和实现 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一种网络协议&#xff0c;用于在局域网内将IP地址映射到MAC地址。在以太网中&#xff0c;设备通过广播ARP请求来查询目标IP地址对应的MAC地址&#xff0c;从而建立通信…...

大脑特训,自信 “满格”

编辑&#xff1a;念小艺 在追求自信的漫漫长路上&#xff0c;诸多因素如同闪耀的星光&#xff0c;为人们指引着方向。保持良好的饮食习惯&#xff0c;让身体摄取充足且均衡的营养&#xff0c;为精神的饱满提供坚实后盾&#xff1b;持续投身于锻炼之中&#xff0c;在挥洒汗水的…...

如何备份和恢复 PostgreSQL 数据库 ?

对于数据库管理员和开发人员来说&#xff0c;在 PostgreSQL 中创建数据库副本是一项至关重要的任务。此过程对于测试、备份、数据分析等都是必不可少的。在本指南中&#xff0c;我们将深入研究创建 PostgreSQL 数据库副本的步骤&#xff0c;以确保数据完整性和系统性能。 必要…...

逆向入门(6)汇编篇-外挂初体验

代码分析部分 游戏里面还是体验了不少自己CV来的外挂的&#xff0c;自己编写的程序还是头一次体验&#xff0c;程序源码如下 void startAcctack() {printf("开始攻击\n");// 获取当前系统时间time_t now time(0); // 获取当前时间的时间戳struct tm *local_time …...

HTML——77.网页编码及乱码处理

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>网页编码及乱码处理</title></head><body><!--网页编码&#xff1a;指网页中特定的字符编码&#xff0c;通过解析编码成为我们知道的文字--><!-…...

(leetcode算法题)382. 链表随机节点

如果给你一个 智能记录 k行内容的小笔记本&#xff0c;从一本你也不知道有多少行的 C Primer 中进行摘抄&#xff0c;你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中&#xff1f; 答&#xff1a;准备好一个公平的轮盘和一个巨大的摇奖机&#xff0c…...

Git 如何在IDEA中进行使用

1. 2. 3....

【Pytorch报错】AttributeError: cannot assign module before Module.__init__() call

代码&#xff1a; import torch.nn as nnclass Model(nn.Module):def __init__(self, input_dim, output_dim):self.linear nn.Linear(input_dim, output_dim) def forward(self, x):out self.linear(x)return outmodel Model(1, 1)报错&#xff1a; --------------------…...

深入理解计算机系统—虚拟内存(一)

一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而&#xff0c;共享主存会形成特殊的挑战。随着对 CPU 需求的增长&#xff0c;进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存&#xff0c;那么它们中的一些就根本无法运行。 为了更加有效地管理内…...