最新资讯

  • 【Linux】动静态库

【Linux】动静态库

2025-04-27 10:01:06 0 阅读

文章目录

  • 静态库
    • 静态库的手动创建过程
  • 动态库
    • 动态库的特点
    • 创建动态库
    • 如何使用动态库
  • 动态库和静态库的优先级
    • 动态库 vs 静态库的优先级
    • 库搜索顺序
  • 总结

静态库

静态库是一种在编译阶段将库文件的内容直接整合到目标程序中的库文件形式。使用静态库后,库的代码会成为可执行文件的一部分,运行时不需要依赖外部库。

静态库的手动创建过程


我们写两个c文件,并且两个c文件都带有头文件:
my_stdio.c

#include "my_stdio.h"
#include
#include
#include
#include
#include
mFILE* mfopen(const char *filename, const char *mode)
{
  int fd = -1;
  // 只写打开
  if(strcmp(mode,"w") == 0)
  {
    // 只写打开文件
    fd = open(filename,O_RDONLY);
  }
  else if(strcmp(mode,"r") == 0)
  {
    // 只写的情况每次打开需要清空,如果不存在需要创建
    fd = open(filename,O_CREAT | O_WRONLY | O_TRUNC,0666);
  }
  else if(strcmp(mode,"a") == 0)
  {
    // 进行追加
    fd = open(filename,O_CREAT | O_APPEND | O_WRONLY);
  }
  //如果fd还是小于0那么直接返回NULL
  if(fd < 0) return NULL;

  // 开辟一段空间然后返回
  mFILE *mf = (mFILE*)malloc(sizeof(mFILE));

  // 打开失败返回NULL
  if(!mf) 
  {
    close(fd);
    return NULL;
  }
  mf->fileno = fd;
  mf->flag =FLUSH_LINE;
  mf->size = 0;
  // 总大小是SIZE
  mf->cap = SIZE;
  return mf;
}

// 刷新操作
void mfflush(mFILE *stream)
{
  if(stream->size > 0)
  {
    // 向对应的流中写入数据
    // 刷新到内核级缓冲区
    write(stream->fileno, stream->outbuffer, stream->size);

    // 刷新到外设当中
    fsync(stream->fileno);
    stream->size = 0;
  }
}

// 向文件中写入
int mfwrite(const void *ptr,int num,mFILE *stream)
{
  // 1.拷贝
  // 写ptr,写到stream当中,本质是写到缓冲区outbuffer当中
  memcpy(stream->outbuffer+stream->size,ptr,num);
  //拷贝完之后要将size扩大,更新缓冲区个数
  stream->size+=num;

  // 写到缓冲区当中需要刷新
  // 2.检测
  // 标记位是按行刷新
  if(stream->flag == FLUSH_LINE && stream->size > 0&& stream->outbuffer[stream->size-1] == '
')
  {
    // 刷新流 
    mfflush(stream);
  }
  // 返回写入字符串的大小
  return num;
}
void mfclose(mFILE *stream)
{
  // stream中有字符直接做刷新
  if(stream->size > 0)
  {
    mfflush(stream);
  }
  // 再关闭文件
  close(stream->fileno);
}

my_stdio.h

#pragma once 
#include
#define SIZE 1024
#define FLUSH_NONE 0// 不刷新
#define FLUSH_LINE 1// 按行刷新
#define FLUSH_FULL 2// 写满刷新
struct IO_FILE
{
  int flag; // 刷新方式
  int fileno; // 文件描述符
  char outbuffer[SIZE]; //缓冲区
  int cap; //缓冲区的容量
  int size; //缓冲区的大小
  //TODO
};


typedef struct IO_FILE mFILE;

mFILE* mfopen(const char *filename, const char *mode);
int mfwrite(const void *ptr,int num,mFILE *stream);
void mfflush(mFILE *stream);
void mfclose(mFILE *stream);

上面两个文件是我们模拟实现的一个简单的stdio.h的库。
my_string.c

#include "my_string.h"

int my_strlen(const char *s)
{
  const char *end = s;
  while(*end != '') end++;
  return end - s;
}

my_string.h

#pragma once 
int my_strlen(const char *s);

另外两个文件则是实现的一个简单的string的一个接口,我们将用这四个文件来手动制作一个静态库。
方法1:
首先我们需要将两个.c文件编译为.o文件:
形成两个同名的.o文件

首先我们来了解一个命令:ar
ar命令是 Linux 下的一个归档工具,通常用于创建、修改和提取静态库(archive files)。它主要用于将多个文件(通常是目标文件 .o)组合成一个归档文件 .a,以便在编译过程中与其他代码链接使用。
常用选项:

  • c:创建归档文件。如果文件已存在,覆盖它。
  • r:将文件添加到归档中。如果已存在相同文件,替换它。
  • t:显示归档文件的内容列表。
  • x:从归档文件中提取文件。
  • d:从归档文件中删除文件。
  • q:快速添加文件到归档末尾,不检查重复文件。
  • s:生成归档文件的索引(一般用于加速链接过程)。

常用语法:

ar [options] archive_name file...

我们就用这个命令来创建静态库:
我们需要用到两个选项,一个是r,一个是c,如果没有这个文件的静态库,则创建,如果有则替换。

这样就形成了一个静态库,但是这样我们还是用不了,我们还需要将库安装到系统当中:

首先我们需要将头文件拷贝到usr目录下的include当中,然后将静态库拷贝到lib64这个文件当中:

注意:这里需要用超级用户来拷贝
在做好准备之后我们可以看见,还是形成不了可执行程序:

系统还是找不到我们要用的静态库,所以我们需要指定给他说我们的静态库是什么名字:

在 gcc 中,-l 选项用于指定链接的库(library)。它的作用是告诉编译器,在链接阶段需要链接某个特定的库。l后面可以加上空格,也可以不加,我们刚刚拷贝到lib64中的是libstdio.a,但是用选项来索引库的时候名字是stdio不需要加前面的lib和后缀.a

形成可执行程序之后我们来运行一下:

方法2:不需要将静态库拷贝到lib64当中
我们先将刚刚加载到系统当中的库删除

我们先将静态库和需要编译的代码放在另一个目录下,方便实验:

可以看见,放在当前目录下的一个指定目录下是不能编译成功的:

我们需要加上另一个选项:

在 gcc 中,-L 选项用于指定库文件的搜索路径。它告诉编译器在指定路径中查找库文件,而不是仅使用默认的库路径(如 /lib 或 /usr/lib)。


加上L的选项还是编译不成功,原因:
原因分析

  1. -L 只指定了路径,但没有指定具体要链接的库

    • -L 告诉编译器在哪里查找库,但不会自动链接路径下的库。
    • 必须使用 -l 显式指定需要链接的库。
  2. 库文件的命名规则
    gcc 查找库文件时,遵循以下命名规则:

    • 静态库:文件名必须以 lib 开头,扩展名为 .a,例如 libmylib.a
    • 动态库:文件名必须以 lib 开头,扩展名为 .so,例如 libmylib.so
    • 当使用 -lmylib 时,编译器会在 -L 指定的路径中查找 libmylib.alibmylib.so

    如果库文件不符合上述命名规则,例如文件名是 mylib.acustom_library.sogcc 无法识别这些文件。

  3. 直接使用库文件路径未显式指定路径
    如果没有通过 -l 指定库,而直接提供库文件路径,则必须使用完整路径:

    gcc main.c /path/to/libmylib.a -o main
    

所以我们需要加上-l选项:

第三种方法:当静态库和头文件都没有放在系统文件当中时
先将include的中的头文件删除了

将头文件和静态库分别放在这两个目录当中

然后我们编译main.c:
在使用 gcc 编译时,-I 选项用于指定头文件的搜索路径,让编译器能够找到自定义或非标准路径中的头文件。


这几个分别是库的名字,和定位库,还有定位头文件。

动态库

动态库是一种在程序运行时加载的库文件,相比静态库,它可以实现代码共享更小的程序体积


动态库的特点

  1. 文件扩展名

    • 在 Linux 系统中,动态库通常以 .so 为扩展名(Shared Object),例如:libmylib.so
  2. 动态加载

    • 程序运行时才会加载动态库,大幅减少可执行文件的大小。
  3. 共享性

    • 同一动态库可以被多个程序同时使用,节省内存资源。
  4. 版本更新方便

    • 更新库文件后,无需重新编译程序,只需确保接口兼容即可。

创建动态库

我们先来写一个简单Makfile

libmystdio.so:my_stdio.o my_string.o
	gcc -o $@ $^ -shared
%.o:%.c
	gcc -fPIC -c $<

.PHONY:clean 
clean:
	@rm -rf *.so *.o stdc*
	@echo "clean ... done"
.PHONY:output
output:
	@mkdir -p stdc/include
	@mkdir -p stdc/lib 
	@cp -f *.h stdc/include
	@cp -f *.so stdc/lib
	@tar -czf stdc.tgz stdc
	@echo "output stdc ... done"


gcc -fPIC -c $<

这个选项中的-fPIC是形成与位置无关码


如何使用动态库

第一种方法:拷贝到系统文件当中

第一种方法和静态库的一样,这里就不做赘述。

第二种方法:建立软链接
可以看见,虽然形成了可执行程序,但是运行的时候还是找不到对应的库


虽然告诉系统库在哪了,但是链接的时候还是没找到。

可以看见在lib64下建立软链接系统就可以找到我们库的位置了

第三种方法:通过控制环境变量来控制系统查找的规则

LD_LIBRARY_PATH 是 Linux 系统中用于指定动态库搜索路径的环境变量。在运行时,动态链接器会根据此变量的值查找所需的共享库文件(.so 文件)。

  1. 动态库的运行时搜索路径

    • 默认情况下,动态链接器会在以下路径中查找共享库:
      • /lib
      • /usr/lib
      • /usr/local/lib
    • 如果动态库存放在非默认路径,需要通过 LD_LIBRARY_PATH 指定额外的搜索路径。
  2. 临时加载动态库

    • 在不修改系统配置文件(如 /etc/ld.so.conf)的情况下,为某些程序临时指定动态库路径。

当修改完环境变量之后,ldd我们的可执行程序,可以看见就可以查看到动态库了。

动态库和静态库的优先级

在 Linux 系统中,使用 gcc 或类似工具进行编译和链接时,动态库(shared library, .so静态库(static library, .a 的优先级由动态链接器和链接器的搜索顺序决定。


动态库 vs 静态库的优先级

  • 默认情况下,链接器优先选择 动态库
  • 如果没有找到对应的动态库,链接器才会选择 静态库

这种行为的主要原因是:

  1. 动态库可以减少可执行文件的大小,并支持运行时共享。
  2. 静态库将整个库文件嵌入可执行文件中,增加了文件体积,且无法享受动态链接的更新优势。

库搜索顺序

  1. 动态库优先搜索路径

    • 在默认路径中(如 /lib, /usr/lib, /usr/local/lib),动态库 .so 文件会被优先查找。
    • 如果通过 -L 指定了自定义路径,也会优先查找 .so
  2. 静态库备选

    • 如果动态库不存在,或者编译时显式指定了使用静态库的选项,链接器会尝试查找 .a 文件。

总结

本文详细介绍了静态库与动态库的概念、创建方法及其使用方式。静态库通过将代码直接打包到可执行文件中,提供了程序独立性;而动态库则通过共享库文件实现了代码复用,减小了程序体积。在实际开发中,理解动态库和静态库的优缺点,合理选择库的类型尤为重要。

此外,文章还探讨了动态库和静态库的优先级以及库的搜索顺序,通过控制编译器选项(如 -L-I)以及环境变量(如 LD_LIBRARY_PATH)来管理库的使用路径。掌握这些基础知识,将帮助开发者更灵活地处理程序链接和依赖问题,提升项目开发效率与可维护性。

总结一句话:熟练掌握静态库和动态库的原理与实践方法,是成为优秀开发者的必经之路。

本文地址:https://www.vps345.com/3189.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge llama 算法 opencv 自然语言处理 神经网络 语言模型 进程 操作系统 进程控制 Ubuntu ssh 阿里云 网络 网络安全 网络协议 ubuntu deepseek Ollama 模型联网 API CherryStudio RTSP xop RTP RTSPServer 推流 视频 科技 ai java 人工智能 个人开发 python MCP android harmonyos typescript 鸿蒙 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 tcp/ip numpy 分布式 面试 性能优化 jdk intellij-idea 架构 YOLO efficientVIT YOLOv8替换主干网络 TOLOv8 运维开发 云原生 华为 开发语言 计算机网络 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn 数据库 centos oracle 关系型 安全 物联网 mcu iot 信息与通信 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 rust http ssl fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 机器学习 LDAP macos 向日葵 aws googlecloud cuda cudnn anaconda spring boot websocket HCIE 数通 笔记 tomcat maven intellij idea rpc nginx dubbo .netcore gateway c++ Clion Nova ResharperC++引擎 Centos7 远程开发 docker 智能路由器 外网访问 内网穿透 端口映射 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 pycharm 深度学习 conda pillow node.js json html5 firefox ESXi sqlserver rust腐蚀 .net 前端框架 mysql 自动化 golang 后端 ollama 大模型 mac 电脑 windows 微服务 springcloud kubernetes 容器 学习方法 经验分享 程序人生 vSphere vCenter 软件定义数据中心 sddc Dify 嵌入式 linux驱动开发 arm开发 嵌入式硬件 AI 爬虫 数据集 MacOS录屏软件 jmeter 软件测试 ide gpu算力 DeepSeek-R1 API接口 pip live555 rtsp rtp WSL win11 无法解析服务器的名称或地址 Hyper-V WinRM TrustedHosts vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 编辑器 鸿蒙系统 asm c# github 创意 社区 源码剖析 rtsp实现步骤 流媒体开发 计算机外设 软件需求 目标检测 Windsurf cpu 内存 实时 使用 flutter ipython 微信 微信分享 Image wxopensdk GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 react.js 前端面试题 持续部署 YOLOv8 NPU Atlas800 A300I pro asi_bench C# MQTTS 双向认证 emqx ESP32 camera Arduino 电子信息 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 adb 统信UOS 麒麟 bonding 链路聚合 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 protobuf 序列化和反序列化 安装 ddos c语言 qt stm32项目 单片机 stm32 debian PVE zotero WebDAV 同步失败 代理模式 WSL2 华为云 开源 udp unity dell服务器 go HarmonyOS Next 大数据 政务 分布式系统 监控运维 Prometheus Grafana 命名管道 客户端与服务端通信 ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 vim VMware安装mocOS VMware macOS系统安装 计算机视觉 YOLOv12 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 oceanbase rc.local 开机自启 systemd unix chatgpt llama3 Chatglm 开源大模型 php 智能手机 NAS Termux Samba Linux ffmpeg 音视频 C 环境变量 进程地址空间 Dell R750XS flask AI编程 AIGC pytorch 温湿度数据上传到服务器 Arduino HTTP sql KingBase 僵尸进程 学习 vscode 客户端 java-ee Agent uni-app 银河麒麟 kylin v10 麒麟 v10 豆瓣 追剧助手 迅雷 nas 致远OA OA服务器 服务器磁盘扩容 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 Reactor 设计模式 C++ CPU 主板 电源 网卡 express okhttp CORS 跨域 游戏机 远程工作 JAVA Java spring cloud dns AI大模型 DeepSeek 程序员 大模型入门 mamba Vmamba https micropython esp32 mqtt matplotlib 飞牛NAS 飞牛OS MacBook Pro kylin arm 腾讯云 microsoft 数据结构 能力提升 面试宝典 技术 IT信息化 大模型微调 系统架构 实时音视频 Ubuntu Server Ubuntu 22.04.5 虚拟化 半虚拟化 硬件虚拟化 Hypervisor dify safari Mac 系统 华为od django sqlite 华为认证 网络工程师 交换机 MS Materials openssl 密码学 监控 自动化运维 蓝耘科技 元生代平台工作流 ComfyUI code-server MQTT mosquitto 消息队列 进程信号 企业微信 Linux24.04 deepin 硬件架构 AISphereButler kafka hibernate 中间件 web安全 可信计算技术 安全架构 网络攻击模型 nvidia 课程设计 shell outlook kamailio sip VoIP 大数据平台 n8n 工作流 workflow echarts 信息可视化 数据分析 网页设计 firewalld 媒体 jar spring W5500 OLED u8g2 TCP服务器 linux 命令 sed 命令 Cookie Java Applet URL操作 服务器建立 Socket编程 网络文件读取 Deepseek 大模型教程 remote-ssh 微信小程序 小程序 国产操作系统 ukui 麒麟kylinos openeuler iftop 网络流量监控 统信 虚拟机安装 框架搭建 安卓 RustDesk自建服务器 rustdesk服务器 docker rustdesk Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer virtualenv web3.py list 模拟实现 ue4 着色器 ue5 虚幻 ragflow mongodb 云服务器 VPS 权限 DevEco Studio 开机自启动 其他 jupyter 低代码 Qwen2.5-coder 离线部署 gitlab 雨云 NPS 飞书 apache 孤岛惊魂4 threejs 3D WebRTC gpt OD机试真题 华为OD机试真题 服务器能耗统计 恒源云 SenseVoice yum源切换 更换国内yum源 QQ 机器人 bot Docker RTMP 应用层 Python 网络编程 聊天服务器 套接字 TCP Socket webrtc IPMITOOL BMC 硬件管理 opcua opcda KEPServer安装 oneapi 传统数据库升级 银行 大语言模型 LLMs iis 图像处理 多线程服务器 Linux网络编程 云服务 springsecurity6 oauth2 授权服务器 token sas FTP 服务器 dba pdf vue 医疗APP开发 app开发 ollama下载加速 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 k8s visualstudio 服务器繁忙 prometheus 银河麒麟操作系统 国产化 rsyslog 测试工具 硬件工程 Docker Hub docker pull 镜像源 daemon.json 无人机 Trae IDE AI 原生集成开发环境 Trae AI devops springboot 驱动开发 嵌入式实习 黑客技术 流式接口 kali 共享文件夹 虚拟机 llm 本地部署 api pyqt DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 Kylin-Server 服务器安装 git npm pyautogui 职场和发展 EasyConnect Cline Kali Linux 黑客 渗透测试 信息收集 zabbix ecmascript nextjs react reactjs android studio 交互 hadoop 压测 ECS bash ssrf 失效的访问控制 log4j openwrt Google pay Apple pay 服务器主板 AI芯片 AI写作 agi prompt 并查集 leetcode 缓存 redis 灵办AI kvm wsl 代码调试 ipdb vr xrdp 远程桌面 远程连接 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 游戏服务器 TrinityCore 魔兽世界 开发环境 SSL证书 adobe fpga开发 openvpn server openvpn配置教程 centos安装openvpn 群晖 文件分享 VMware创建虚拟机 雨云服务器 环境迁移 NFS redhat 视觉检测 VMware安装Ubuntu Ubuntu安装k8s 毕设 自动化编程 Open WebUI 远程控制 远程看看 远程协助 wsl2 k8s集群资源管理 云原生开发 直播推流 elasticsearch jenkins svn 串口服务器 多层架构 解耦 三级等保 服务器审计日志备份 eureka yum gitee gitea RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 微信公众平台 C语言 TRAE html css Invalid Host allowedHosts selenium gradle matlab LLM 大模型面经 大模型学习 bootstrap 分析解读 wireshark 显示过滤器 ICMP Wireshark安装 压力测试 命令 ci/cd KylinV10 麒麟操作系统 Vmware excel transformer 负载均衡 iBMC UltraISO 小艺 Pura X 强制清理 强制删除 mac废纸篓 自动驾驶 thingsboard postgresql r语言 数据可视化 宝塔面板 部署 磁盘监控 服务器配置 Ark-TS语言 rabbitmq IIS .net core Hosting Bundle .NET Framework vs2022 ros2 moveit 机器人运动 网络结构图 生物信息学 openEuler cmos 硬件 状态管理的 UDP 服务器 Arduino RTOS pygame mariadb telnet 远程登录 rdp 实验 gpt-3 文心一言 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 王者荣耀 Wi-Fi DNS 远程 执行 sshpass 操作 mybatis Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 UOS 统信操作系统 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 实战案例 云电竞 云电脑 todesk ArcTS 登录 ArcUI GridItem arkUI 设备 GPU PCI-Express 拓扑图 ping++ 深度优先 图论 并集查找 换根法 树上倍增 SSH 产品经理 SWAT 配置文件 服务管理 网络共享 gaussdb ruoyi docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos DeepSeek行业应用 Heroku 网站部署 迁移指南 系统安全 IIS服务器 IIS性能 日志监控 next.js 部署next.js vmware 卡死 RAID RAID技术 磁盘 存储 ocr asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 nuxt3 ssh漏洞 ssh9.9p2 CVE-2025-23419 测试用例 功能测试 小游戏 五子棋 矩阵 服务器管理 配置教程 网站管理 软件工程 实时互动 银河麒麟服务器操作系统 系统激活 多进程 ansible playbook 剧本 AI代码编辑器 tcpdump 算力 博客 混合开发 环境安装 JDK 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 visual studio code KVM 工业4.0 蓝桥杯 mysql离线安装 ubuntu22.04 mysql8.0 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 linux安装配置 源码 毕业设计 金融 同步 备份 建站 安全威胁分析 腾讯云大模型知识引擎 centos-root /dev/mapper yum clean all df -h / du -sh grafana 京东云 IPMI 命令行 基础入门 编程 etcd 数据安全 RBAC hive Hive环境搭建 hive3环境 Hive远程模式 漏洞 kind 微信开放平台 微信公众号配置 unity3d 网络穿透 报错 Xterminal bug rag ragflow 源码启动 Redis Desktop 弹性计算 裸金属服务器 弹性裸金属服务器 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 p2p rclone AList webdav fnOS jvm 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 HTTP 服务器控制 ESP32 DeepSeek MySql 链表 备选 网站 调用 示例 AD域 AutoDL 宝塔 cnn sublime text 邮件APP 免费软件 lio-sam SLAM glibc OpenManus vasp安装 边缘计算 业界资讯 模拟退火算法 软负载 HiCar CarLife+ CarPlay QT RK3588 yolov8 CLion pgpool Node-Red 编程工具 流编程 端口测试 计算机 田俊楠 curl wget deepseek r1 银河麒麟高级服务器 外接硬盘 Kylin 华为机试 数据库系统 make命令 makefile文件 回显服务器 UDP的API使用 做raid 装系统 armbian u-boot ip命令 新增网卡 新增IP 启动网卡 ios iphone arcgis GCC crosstool-ng SSH 密钥生成 SSH 公钥 私钥 生成 游戏程序 文件系统 用户缓冲区 ftp web 火绒安全 升级 CVE-2024-7347 rustdesk ArkTs ArkUI frp 内网服务器 内网代理 内网通信 ShenTong VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 自动化任务管理 线程 big data opensearch helm 代理 路径解析 uniapp web3 tcp vscode1.86 1.86版本 ssh远程连接 单一职责原则 open webui IMM 智能音箱 智能家居 北亚数据恢复 oracle数据恢复 版本 gcc VSCode 移动云 游戏引擎 指令 鲲鹏 mq rocketmq CH340 串口驱动 CH341 uart 485 XCC Lenovo x64 SIGSEGV SSE xmm0 miniapp 真机调试 调试 debug 断点 网络API请求调试方法 spark HistoryServer Spark YARN jobhistory 繁忙 解决办法 替代网站 汇总推荐 AI推理 AI-native Docker Desktop RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 asp.net大文件上传下载 Linux的权限 办公自动化 自动化生成 pdf教程 自定义客户端 SAS skynet GoogLeNet bcompare Beyond Compare IM即时通讯 剪切板对通 HTML FORMAT zookeeper nfs 服务器部署ai模型 embedding SSL 域名 Anolis nginx安装 linux插件下载 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 大大通 第三代半导体 碳化硅 Windows ai工具 集成学习 集成测试 v10 软件 ldap ui 3d GIS 遥感 WebGIS cursor 阿里云ECS 设置代理 实用教程 LORA NLP WebUI DeepSeek V3 运维监控 URL SSH 服务 SSH Server OpenSSH Server 相机 图形化界面 多个客户端访问 IO多路复用 TCP相关API EMUI 回退 降级 h.264 LLM Web APP Streamlit 网卡的名称修改 eth0 ens33 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors minicom 串口调试工具 fd 文件描述符 网工 搜索引擎 DenseNet MI300x 技能大赛 ux 多线程 qemu libvirt apt open Euler dde linux环境变量 Xinference RAGFlow SRS 流媒体 直播 ruby 单元测试 Deepseek-R1 私有化部署 推理模型 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 elk docker命令大全 自动化测试 性能测试 odoo 服务器动作 Server action DocFlow tidb GLIBC 信号处理 换源 国内源 Debian 崖山数据库 YashanDB 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 python3.11 视频编解码 远程服务 Ubuntu 24.04.1 轻量级服务器 minio dash 正则表达式 edge浏览器 信创 信创终端 中科方德 centos 7 Docker Compose docker compose docker-compose 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 相差8小时 UTC 时间 sqlite3 netty 远程过程调用 Windows环境 tensorflow trae 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 langchain deep learning swoole Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 FTP服务器 监控k8s 监控kubernetes 健康医疗 无桌面 risc-v wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 软考 联想开天P90Z装win10 c 交叉编译 执法记录仪 智能安全帽 smarteye ceph ecm bpm 反向代理 CrewAI 宕机切换 服务器宕机 rime 金仓数据库 2025 征文 数据库平替用金仓 MCP server C/S aarch64 编译安装 HPC windows日志 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 idm Minecraft DOIT 四博智联 MacMini 迷你主机 mini Apple webstorm 宠物 免费学习 宠物领养 宠物平台 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 iDRAC R720xd 树莓派 VNC freebsd 5G 3GPP 卫星通信 常用命令 文本命令 目录命令 匿名管道 监控k8s集群 集群内prometheus H3C VR手套 数据手套 动捕手套 动捕数据手套 前后端分离 输入法 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 程序员创富 xml XFS xfs文件系统损坏 I_O error es ROS docker run 数据卷挂载 交互模式 数学建模 file server http server web server 云桌面 微软 AD域控 证书服务器 个人博客 X11 Xming 昇腾 npu 虚拟显示器 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 虚拟局域网 selete 高级IO av1 电视盒子 机顶盒ROM 魔百盒刷机 Jellyfin FunASR ASR AnythingLLM AnythingLLM安装 重启 排查 系统重启 日志 原因 我的世界 我的世界联机 数码 xshell termius iterm2 Kali neo4j 数据仓库 数据库开发 database 技术共享 Claude dity make keepalived ros eNSP 网络规划 VLAN 企业网络 sonoma 自动更新 jetty undertow grub 版本升级 扩容 chrome devtools chromedriver ISO镜像作为本地源 序列化反序列化 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 SysBench 基准测试 人工智能生成内容 ip 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 英语 音乐服务器 Navidrome 音流 xcode 系统开发 binder 车载系统 framework 源码环境 Cursor 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 Erlang OTP gen_server 热代码交换 事务语义 openstack Xen MNN Qwen USB网络共享 Playwright pppoe radius hugo P2P HDLC 思科 Netty 即时通信 NIO nac 802.1 portal Dell HPE 联想 浪潮 Linux PID linux上传下载 QT 5.12.12 QT开发环境 Ubuntu18.04 dns是什么 如何设置电脑dns dns应该如何设置 银河麒麟桌面操作系统 Kylin OS MQTT协议 消息服务器 代码 LInux 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 AI作画 sdkman 聊天室 程序 性能分析 sequoiaDB AI agent uv 思科模拟器 Cisco 图形渲染 saltstack 黑苹果 prometheus数据采集 prometheus数据模型 prometheus特点 qt项目 qt项目实战 qt教程 muduo 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP alias unalias 别名 wps Radius rnn 显卡驱动 大模型应用 EMQX 通信协议 计算虚拟化 弹性裸金属 深度求索 私域 知识库 epoll 社交电子 seatunnel 阻塞队列 生产者消费者模型 服务器崩坏原因 vscode 1.86 HarmonyOS DBeaver kerberos 小智AI服务端 xiaozhi TTS 直流充电桩 充电桩 jina AD 域管理 SEO 网站搭建 serv00 chfs ubuntu 16.04 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 显示管理器 lightdm gdm seleium Nuxt.js 目标跟踪 OpenVINO 推理应用 flash-attention 产测工具框架 IMX6ULL 管理框架 私有化 Logstash 日志采集 毕昇JDK 开发 我的世界服务器搭建 minecraft USB转串口 Linux的基础指令 语音识别 harmonyOS面试题 移动魔百盒 查询数据库服务IP地址 SQL Server ubuntu24.04.1 网络建设与运维 历史版本 下载 NLP模型 自学笔记 小米 澎湃OS Android etl EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 SVN Server tortoise svn wpf fast 端口 查看 ss flink 读写锁 AI Agent 字节智能运维 TrueLicense WSL2 上安装 Ubuntu 存储维护 NetApp存储 EMC存储 c/c++ 串口 vpn docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 镜像 支付 微信支付 开放平台 PX4 超融合 easyui Mac内存不够用怎么办 影刀 #影刀RPA# 飞牛nas fnos cocoapods 进程优先级 调度队列 进程切换 autodl less Attention 渗透 DeepSeek r1 sysctl.conf vm.nr_hugepages eclipse 策略模式 单例模式 CDN Headless Linux figma 免费域名 域名解析 飞牛 Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 su sudo bat 僵尸世界大战 游戏服务器搭建 模拟器 教程 李心怡 Ubuntu22.04 开发人员主页 trea idea java-rocketmq g++ g++13 docker部署Python 大模型部署 项目部署到linux服务器 项目部署过程 键盘 架构与原理 banner 嵌入式Linux IPC 企业网络规划 华为eNSP gnu 内网环境 软链接 硬链接 推荐算法 cpp-httplib 多端开发 智慧分发 应用生态 鸿蒙OS onlyoffice 嵌入式系统开发 jellyfin 代理服务器 中兴光猫 换光猫 网络桥接 自己换光猫 Unity Dedicated Server Host Client 无头主机 cd 目录切换 db virtualbox 元服务 应用上架 ubuntu24 vivado24 perf linux内核 midjourney UOS1070e 安卓模拟器 稳定性 看门狗 代码托管服务 Typore css3 perl xpath定位元素 sentinel 知识图谱 区块链 rancher 强化学习 本地环回 bind deekseek lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 WLAN 佛山戴尔服务器维修 佛山三水服务器维修 实习 加解密 Yakit yaklang 干货分享 黑客工具 密码爆破 CentOS 流水线 脚本式流水线 tailscale derp derper 中转 triton 模型分析 线性代数 电商平台 服务器时间 IDEA 互信 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 信号 PPI String Cytoscape CytoHubba 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 Linux环境 WebVM nftables 防火墙 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR NAT转发 NAT Server lua firewall 虚幻引擎 域名服务 DHCP 符号链接 配置 音乐库 安防软件 hosts 浏览器开发 AI浏览器 iventoy VmWare OpenEuler 聚类 Python基础 Python教程 Python技巧 软件构建 本地知识库部署 DeepSeek R1 模型 7z Spring Security rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 磁盘清理 powerpoint 环境配置 Ubuntu共享文件夹 共享目录 Linux共享文件夹 HarmonyOS NEXT 原生鸿蒙 IO模型 基础环境 游戏开发 ubuntu20.04 开机黑屏 searxng 计算生物学 生物信息 基因组 主从复制 带外管理 服务网格 istio 大模型推理 cfssl 沙盒 抗锯齿 can 线程池 llama.cpp 虚拟现实 ssh远程登录 语法 大模型技术 本地部署大模型 互联网医院 双系统 GRUB引导 Linux技巧 本地部署AI大模型 xss OpenHarmony 分布式训练 IMX317 MIPI H265 VCU 捆绑 链接 谷歌浏览器 youtube google gmail react native dock 加速 CentOS Stream yaml Ultralytics 可视化 DIFY regedit 开机启动 VS Code HAProxy OpenSSH 物联网开发 根服务器 clickhouse 本地化部署 nlp yolov5 考研 laravel junit IPv4 子网掩码 公网IP 私有IP 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 webgl k8s二次开发 集群管理 玩机技巧 软件分享 软件图标 TCP协议 composer 需求分析 规格说明书 对比 工具 meld DiffMerge 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 端口聚合 windows11 powerbi milvus 达梦 DM8 System V共享内存 进程通信 智慧农业 开源鸿蒙 团队开发 开源软件 软件卸载 系统清理 话题通信 服务通信 Linux权限 权限命令 特殊权限 智能电视 CPU 使用率 系统监控工具 linux 命令 docker desktop image MAC SecureCRT 硅基流动 ChatBox deployment daemonset statefulset cronjob ABAP 粘包问题 word WebServer UEFI Legacy MBR GPT U盘安装操作系统 rpa MacOS Linux find grep 钉钉 AI员工 ELF加载 navicat 抓包工具 服务器扩容没有扩容成功 IO 热榜 视频平台 录像 视频转发 视频流 kernel wsgiref Web 服务器网关接口 Qwen2.5-VL vllm fork wait waitpid exit MAVROS 四旋翼无人机 离线部署dify MDK 嵌入式开发工具 论文笔记 nosql vnc ardunio BLE zip unzip 网络爬虫 内核 Web服务器 多线程下载工具 PYTHON 极限编程 windows 服务器安装 安装MySQL 通信工程 毕业 电视剧收视率分析与可视化平台 Reactor反应堆 java-rabbitmq conda配置 conda镜像源 kotlin 论文阅读 搭建个人相关服务器 iperf3 带宽测试 Sealos 查看显卡进程 fuser ArtTS 网络搭建 神州数码 神州数码云平台 云平台 copilot ebpf uprobe visual studio nvm whistle 风扇控制软件 samba 流量运营 ip协议 Linux 维护模式 ranger MySQL8.0 欧标 OCPP mcp服务器 client close mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 问题解决 ubuntu 18.04 Unity插件 宝塔面板无法访问 MVS 海康威视相机 proxy模式 烟花代码 烟花 元旦 性能调优 安全代理 浏览器自动化 UDP 在线office export import save load 迁移镜像 合成模型 扩散模型 图像生成 fstab vu大文件秒传跨域报错cors 多路转接 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 鸿蒙开发 移动开发 top Linux top top命令详解 top命令重点 top常用参数 win服务器架设 windows server ros1 Noetic 20.04 apt 安装 机柜 1U 2U 项目部署 状态模式 lb 协议 云耀服务器 React Next.js 开源框架 notepad hexo 容器技术 隐藏文件 隐藏目录 管理器 通配符 国产数据库 瀚高数据库 数据迁移 下载安装 tar K8S k8s管理系统 mysql安装报错 windows拒绝安装 数字证书 签署证书 接口优化 图片增强 增强数据 服务器正确解析请求体 西门子PLC 通讯 解决方案 fonts-noto-cjk CosyVoice 华为证书 HarmonyOS认证 华为证书考试 服务器部署 本地拉取打包 MobaXterm Web应用服务器 多产物 WINCC 网络文件系统 Carla 智能驾驶 yum换源 macOS js 搜狗输入法 中文输入法