从零到交付:通用 C/C++ 项目容器镜像搭建完全指南
本文基于 Fast DDS QoS 工程实践提炼而成适用于任何 C/C、Go、Rust 等编译型语言项目的容器化。核心思路先理解产物 → 确认环境 → 分析依赖 → 编译验证 → 收集库 → 编写 Dockerfile → 构建检查 → 运行测试 → 打包部署。一、整体思路容器化的八步走战略容器化不是简单地写个 Dockerfile而是一条分层递进的工程流水线。每一层都依赖上一层正确完成任何一层有缺口后面都会出问题。┌─────────────────────────────────────────────────┐ │ 第 8 层打包 部署docker save / push │ ├─────────────────────────────────────────────────┤ │ 第 7 层容器内运行 验收 │ ├─────────────────────────────────────────────────┤ │ 第 6 层构建后检查架构 / 依赖 / 启动 │ ├─────────────────────────────────────────────────┤ │ 第 5 层编写 Dockerfile │ ├─────────────────────────────────────────────────┤ │ 第 4 层收集运行时动态库runtime-libs/ │ ├─────────────────────────────────────────────────┤ │ 第 3 层主机上编译 验证 │ ├─────────────────────────────────────────────────┤ │ 第 2 层分析依赖file / ldd / 头文件 │ ├─────────────────────────────────────────────────┤ │ 第 1 层确认环境架构 / Docker / 基础镜像 │ └─────────────────────────────────────────────────┘核心原则程序必须在目标架构上编译或者使用与目标架构一致的交叉编译环境。不能在 x86 机器上编译 ARM 程序然后塞进 ARM 镜像。二、第一步确认环境 —— 一切的起点2.1 确认目标机器架构uname-m输出含义aarch64/arm64ARM 64 位如 Kylin ARM、飞腾、鲲鹏x86_64Intel/AMD 64 位riscv64RISC-V 64 位⚠️ 关键后续编译、基础镜像、动态库全部必须与目标架构一致。2.2 确认 Docker 可用dockerversion检查 Client 和 Server 都正常重点关注 Server 端版本。2.3 确认基础镜像# 列出已有镜像dockerimages--format{{.Repository}}:{{.Tag}}# 检查特定镜像的架构dockerimage inspect镜像名--format{{.Os}}/{{.Architecture}}选择基础镜像的原则优先使用目标环境已有的内网镜像避免构建时联网超时确认架构匹配linux/arm64、linux/amd64等不要盲目写FROM ubuntu:20.04先看看本地有什么# ✅ 好的做法使用内网 ARM64 镜像 FROM 192.168.16.61:30443/library/eclipse-temurin:17.0.19_10-jre-noble # ❌ 不好的做法假设能访问 Docker Hub FROM ubuntu:20.04三、第二步分析依赖 —— 搞清楚需要什么C/C 程序的依赖分三类缺一不可类型说明示例编译依赖头文件、CMake 配置、静态库fastddsConfig.cmake、*.h运行依赖程序启动时动态加载的.solibssl.so.1.1、libfastdds.so环境依赖网络、共享内存、权限、配置文件--network host、/dev/shm3.1 确认可执行文件架构编译完成后第一件事就是检查架构filebuild/MyProgram期望输出ELF 64-bit LSB pie executable, ARM aarch64 # 或 ELF 64-bit LSB pie executable, x86-64如果架构不对比如在 x86 上编译了程序却要放进 ARM 镜像立即停止重新选择构建环境。3.2 查看动态库依赖最重要的一步ldd build/MyProgram输出示例libfastdds.so.3 /home/user/opt/fastdds/lib/libfastdds.so.3 libtinyxml2.so.6 not found ❌ 缺失 libssl.so.1.1 not found ❌ 缺失 libstdc.so.6 /lib/aarch64-linux-gnu/libstdc.so.6重点看not found每个not found都是一颗定时炸弹。核心洞察“目标主机上能运行” ≠ “基础镜像里也能运行”。主机可能已经装了这些库但容器是独立的文件系统看不到主机的/lib。3.3 确认第三方库安装位置# 以 Fast DDS 为例exportMYLIB_HOME/path/to/install/prefixls-l$MYLIB_HOME/include# 头文件ls-l$MYLIB_HOME/lib# 库文件3.4 确认 CMake 能找到依赖exportCMAKE_PREFIX_PATH$MYLIB_HOME:${CMAKE_PREFIX_PATH}cmake-S.-BbuildCMAKE_PREFIX_PATH告诉 CMake 去哪里找xxxConfig.cmake、头文件和库-S .源代码目录-B build构建输出目录不污染源代码四、第三步编译 主机验证4.1 设置编译环境exportMYLIB_HOME/path/to/install/prefixexportCMAKE_PREFIX_PATH$MYLIB_HOME:${CMAKE_PREFIX_PATH}exportLD_LIBRARY_PATH$MYLIB_HOME/lib${LD_LIBRARY_PATH::$LD_LIBRARY_PATH}LD_LIBRARY_PATH只影响当前 Shell不会自动写入镜像Dockerfile 里要单独设置。4.2 编译cmake-S.-Bbuild-DCMAKE_BUILD_TYPERelease cmake--buildbuild -j$(nproc)参数含义-DCMAKE_BUILD_TYPERelease发布版本优化编译-j$(nproc)按 CPU 核心数并行编译4.3 在主机上先验证容器化之前必做# 终端 1启动服务端/订阅端./build/MyServer--config./config.xml# 终端 2启动客户端/发布端./build/MyClient--config./config.xml验收原则以接收端为准发送端显示成功只能说明本地调用成功不代表对端收到。经验法则如果主机上都跑不通容器里一定也跑不通。先修好主机上的问题再谈容器化。五、第四步收集运行时动态库这是整个流程中最容易出错的环节。5.1 创建干净的库目录rm-rfruntime-libsmkdir-pruntime-libs5.2 复制第三方库cp-a$MYLIB_HOME/lib/*.so* runtime-libs/cp -a保留符号链接关系动态库通常是一串软链接libxxx.so→libxxx.so.3→libxxx.so.3.6.1不能只复制一个。5.3 补齐系统库根据ldd的结果逐个补齐not found的库# 示例补齐 TinyXML2 和 OpenSSLcp-a/lib/aarch64-linux-gnu/libtinyxml2.so.6* runtime-libs/cp-a/lib/aarch64-linux-gnu/libssl.so.1.1* runtime-libs/cp-a/lib/aarch64-linux-gnu/libcrypto.so.1.1* runtime-libs/通用方法换项目时照做对每个可执行文件运行ldd找出所有not found或基础镜像中没有的库用find/dpkg -S/rpm -qf定位真实文件复制库文件及其所有符号链接构建镜像后再次在容器内ldd验证# 辅助定位命令find/lib /usr/lib$MYLIB_HOME/lib-namelib*.so*2/dev/null|grep-E关键词dpkg-Slibxxx.so.6# Debian/Ubunturpm-qf/lib/libxxx.so.6# CentOS/RHEL六、第五步编写 Dockerfile6.1 Dockerfile 模板# # 多阶段构建推荐 # # ---- 阶段 1构建阶段如果支持在容器内编译---- # FROM base AS builder # WORKDIR /build # COPY . . # RUN cmake -S . -B build cmake --build build -j4 # ---- 阶段 2运行阶段精简---- ARG BASE_IMAGE你的内网基础镜像 FROM ${BASE_IMAGE} WORKDIR /opt/myapp # 复制编译好的可执行文件 COPY build/MyProgram /opt/myapp/bin/MyProgram # 复制配置文件 COPY config/*.xml /opt/myapp/config/ # 复制运行时库 COPY runtime-libs/ /opt/myapp/lib/ # 确保可执行权限 RUN chmod 0755 /opt/myapp/bin/MyProgram # 设置库搜索路径 ENV LD_LIBRARY_PATH/opt/myapp/lib:/usr/local/lib # 默认启动命令按需修改 CMD [/bin/sh]6.2 逐项说明指令作用ARG BASE_IMAGE允许构建时替换基础镜像FROM指定基础镜像和架构WORKDIR设置工作目录COPY将文件从构建上下文复制到镜像内chmod 0755确保程序有执行权限ENV LD_LIBRARY_PATH让程序找到动态库CMD默认启动命令6.3 检查清单FROM的架构是否与目标机一致COPY的源文件是否都真实存在WORKDIR、程序路径、配置路径是否一致chmod是否覆盖所有可执行文件ENV LD_LIBRARY_PATH是否包含实际库目录是否需要--network host、--ipchost等特殊权限是否需要在 Dockerfile 中安装额外包apt-get/yum七、第六步构建镜像7.1 构建前检查上下文ls-lDockerfile build/MyProgram config/*.xml runtime-libs/确保所有COPY引用的文件都存在。7.2 执行构建dockerbuild--pullfalse-tmyapp:1.0.0.参数含义--pullfalse不尝试从远程更新基础镜像离线环境必备-t myapp:1.0.0设置镜像名和不可变版本号.当前目录为构建上下文7.3 常见错误错误原因解决Dockerfile: no such file当前目录不对或文件名大小写错误pwdls -l DockerfileClient.Timeout exceeded无法访问 Docker Hub改用内网基础镜像 --pullfalseCOPY failed: no source源文件不存在检查文件路径和构建上下文八、第七步构建后检查逐层验证8.1 检查镜像架构dockerimage inspect myapp:1.0.0--format{{.Os}}/{{.Architecture}}# 必须输出linux/arm64或对应架构8.2 检查文件是否到位dockerrun--rm--entrypoint/bin/sh myapp:1.0.0-c\ls -l /opt/myapp/bin /opt/myapp/config /opt/myapp/lib8.3 检查动态库解析dockerrun--rm--entrypoint/bin/sh myapp:1.0.0-c\ldd /opt/myapp/bin/MyProgram如果还有not found回到第 5 步补齐库重新构建。8.4 检查程序能否启动dockerrun--rmmyapp:1.0.0 /opt/myapp/bin/MyProgram--help九、第八步容器内运行 验收9.1 同一主机上的多容器# 终端 1启动服务端dockerrun--rm--networkhost--ipchost myapp:1.0.0\/opt/myapp/bin/MyServer--config/opt/myapp/config/server.xml# 终端 2启动客户端dockerrun--rm--networkhost--ipchost myapp:1.0.0\/opt/myapp/bin/MyClient--config/opt/myapp/config/client.xml参数含义--network host使用主机网络UDP 发现、数据传输--ipchost共享主机 IPC共享内存通信必需--rm退出后自动清理容器9.2 常见假通过陷阱现象真正原因Writer write() 成功Reader 收到 0 条缺少--ipchost共享内存通道隔离端点匹配但无数据检查 Domain/Topic/数据类型是否一致连接超时检查防火墙、端口、网络策略记住验收必须以接收端实际数据为准9.3 跨主机部署要点--ipchost不能跨主机必须明确使用 UDP/TCP不能依赖共享内存防火墙放通发现端口和数据端口在真实双机环境重新完整测试十、第九步打包 部署10.1 导出镜像为 tardockersave-omyapp-1.0.0.tar myapp:1.0.0ls-lhmyapp-1.0.0.tardocker save导出的是完整镜像包含所有层可直接上传 Harbor 或离线传输。10.2 直接推送到 Harbor如果网络可达dockertag myapp:1.0.0harbor-host/project/myapp:1.0.0dockerpushharbor-host/project/myapp:1.0.010.3 版本管理原则✅ 使用不可变版本号1.0.0、1.0.1❌ 不要使用latest无法追溯任何变更代码、库、配置、基础镜像都应递增版本号十一、运行时配置文件runtime.yaml注意事项如果你的平台使用runtime.yaml非 Kubernetes Pod YAML注意apiVersion:runtime.jfounder.io/v1kind:RuntimeConfigports:-name:managementport:8080protocol:TCPexpose:truemanagement:portName:managementenv:-name:LD_LIBRARY_PATHvalue:/opt/myapp/lib:/usr/local/lib不要写 Kubernetes 字段metadata、spec、containers、image、command、args重要YAML 通过 Schema 校验 ≠ 平台能正确运行你的程序。如果程序不实现平台管理接口需要额外包装。十二、通用排错手册12.1 快速定位流程图问题出现 │ ├─ 构建失败 │ ├─ Dockerfile 找不到 → 检查 pwd 文件名 │ ├─ 基础镜像拉不到 → 改用内网镜像 --pullfalse │ └─ COPY 失败 → 检查源文件是否存在于构建上下文 │ ├─ 启动报错 │ ├─ 动态库缺失 → ldd 查缺 补齐 runtime-libs │ ├─ 配置文件找不到 → 检查容器内路径 vs 宿主机路径 │ └─ 权限不足 → chmod 检查用户/设备权限 │ ├─ 网络通信异常 │ ├─ 收不到数据 → 检查 --network host --ipchost │ ├─ 端点不匹配 → 检查 Domain/Topic/数据类型 │ └─ 端口不通 → 检查防火墙 安全组 │ └─ 架构不匹配 └─ uname -m file docker inspect 三连确认12.2 错误速查表错误信息根因解决方案Dockerfile: no such file目录不对或大小写错误pwdls DockerfileClient.Timeout exceeded无法访问公网仓库内网镜像 --pullfalselibxxx.so: cannot open动态库缺失ldd→ 找库 → 复制 → 重建write() 成功但收到 0 条缺--ipchost加上--ipchost架构不匹配x86 程序放进 ARM 镜像在 ARM 机器重新编译XML 找不到用了宿主机路径改用容器内路径/opt/...十三、换项目时的完整检查清单编译前目标机器架构已确认uname -m基础镜像已存在且架构匹配确认工程生成的可执行文件名称看 CMakeLists.txt / Makefile确认配置文件清单设置正确的 CMake 前缀路径编译后file确认架构正确ldd没有not found程序在主机上运行通过退出码和业务输出符合预期构建镜像前Dockerfile 位于工程根目录所有COPY源文件真实存在所有动态库已放入runtime-libs/ENV LD_LIBRARY_PATH包含库目录不依赖不可用的公网仓库构建镜像后镜像架构正确docker inspect容器内文件路径正确容器内ldd无not found程序可在容器内启动网络、IPC、权限均已验证以接收端实际结果为准部署前使用不可变版本号非latest关键业务测试已重新执行docker save导出 tar 或 Harbor 推送成功镜像名和 Tag 与部署配置一致runtime.yaml 使用平台真实 Schema十四、一条命令流走完全程以下是换项目时的最短完整流程模板# 1. 环境确认 cd/path/to/projectuname-mdockerversion# 2. 设置依赖环境 exportMYLIB_HOME/path/to/installexportCMAKE_PREFIX_PATH$MYLIB_HOME:${CMAKE_PREFIX_PATH}exportLD_LIBRARY_PATH$MYLIB_HOME/lib${LD_LIBRARY_PATH::$LD_LIBRARY_PATH}# 3. 编译 cmake-S.-Bbuild-DCMAKE_BUILD_TYPERelease cmake--buildbuild -j$(nproc)# 4. 架构 依赖检查 filebuild/MyProgram ldd build/MyProgram# 5. 主机验证 ./build/MyProgram--test# 6. 收集动态库 rm-rfruntime-libsmkdir-pruntime-libscp-a$MYLIB_HOME/lib/*.so* runtime-libs/# 根据 ldd 结果补齐系统库cp-a/lib/aarch64-linux-gnu/libxxx.so* runtime-libs/# 7. 构建镜像 dockerbuild--pullfalse-tmyapp:1.0.0.# 8. 构建后检查 dockerimage inspect myapp:1.0.0--format{{.Os}}/{{.Architecture}}dockerrun--rm--entrypoint/bin/sh myapp:1.0.0-cldd /opt/myapp/bin/MyProgramdockerrun--rmmyapp:1.0.0 /opt/myapp/bin/MyProgram--help# 9. 容器内运行 dockerrun--rm--networkhost--ipchost myapp:1.0.0\/opt/myapp/bin/MyProgram--config/opt/myapp/config/app.xml# 10. 打包 dockersave-omyapp-1.0.0.tar myapp:1.0.0附录核心命令速查卡命令用途uname -m查看 CPU 架构file binary查看可执行文件架构ldd binary查看动态库依赖docker image inspect img查看镜像元数据架构等docker build --pullfalse -t name:tag .离线构建镜像docker run --rm -it --network host --ipchost运行容器同机通信docker save -o file.tar image:tag导出镜像为 tardocker tagdocker push推送到 Harborfind / -name lib*.so*定位动态库文件dpkg -S file/rpm -qf file查询文件属于哪个包总结容器化的本质是依赖管理 环境复现。搞清楚程序需要什么然后把所有需要的东西装进一个隔离的文件系统最后确保运行时环境和主机打通。掌握这套思路任何 C/C 工程的容器化都能举一反三。# 从零到交付通用 C/C 项目容器镜像搭建完全指南本文基于 Fast DDS QoS 工程实践提炼而成适用于任何 C/C、Go、Rust 等编译型语言项目的容器化。核心思路先理解产物 → 确认环境 → 分析依赖 → 编译验证 → 收集库 → 编写 Dockerfile → 构建检查 → 运行测试 → 打包部署。

相关新闻

白话AI一:人工智能、机器学习、深度学习、大模型的层级关系

白话AI一:人工智能、机器学习、深度学习、大模型的层级关系

很多新手学AI的第一个卡壳点:被一堆相似名词绕晕。 刷文章看到:人工智能、AI、机器学习、深度学习、大模型、LLM…… 看起来全是一个东西,又感觉各有不同,越看越乱,最后干脆放弃深究,只停留在“AI能聊天”的…

2026/8/29 4:43:41 阅读更多 →
美团2017秋招算法工程师笔试真题解析:考点与备考策略

美团2017秋招算法工程师笔试真题解析:考点与备考策略

算法工程师这个岗位的秋招笔试,向来是筛选简历之后第一道大坎,也是淘汰率最高的一环。美团2017秋招笔试真题-算法工程师A这份卷子,我当年也做过,后来带新人的时候又翻出来拆过好几遍。别看是2017年的题,很多考点放到现…

2026/8/30 7:06:35 阅读更多 →
DiskGenius下载与C盘扩容教程(2026):磁盘分区、数据恢复一次讲清

DiskGenius下载与C盘扩容教程(2026):磁盘分区、数据恢复一次讲清

DiskGenius下载与C盘扩容教程(2026):磁盘分区、数据恢复一次讲清 电脑 C 盘空间告急、想给硬盘重新分区、误删了文件想找回——这些磁盘相关的糟心事,DiskGenius 都能处理。它是成都易我科技出品的磁盘工具,在分区管理…

2026/8/29 4:43:41 阅读更多 →

最新新闻

Three.js原生支持Gaussian Splatting:从加载到渲染的完整实践指南

Three.js原生支持Gaussian Splatting:从加载到渲染的完整实践指南

之前在项目里做实景三维展示的时候,3D Gaussian Splatting 一直是一个非常让人又爱又恨的方向。效果确实惊艳,但接入 Three.js 的链路很长:自己写点云解析、处理 PLY 格式、做视锥排序、挂自定义着色器,稍微不注意就会遇到黑屏、花…

2026/8/30 7:06:07 阅读更多 →
05-M5-自适应检索与答案反思-让系统自己检查作业

05-M5-自适应检索与答案反思-让系统自己检查作业

自适应检索 答案反思:让系统自己检查作业(M5 落地实测) 系列:城市管理 Agentic RAG —— 从零搭建城市管理问答系统 本篇:M5 自适应检索 答案反思(实测版) 源码:https://gitee.co…

2026/8/30 7:06:07 阅读更多 →
江西高三冲刺班收费标准

江西高三冲刺班收费标准

江西高三冲刺班多少钱?南昌金博教育全日制封闭冲刺班费用解析 南昌金博教育是南昌本地一所专注于高三全日制冲刺的集训学校,采用封闭管理模式,面向江西高三应届生及复读生招生。随着高考临近,不少家长开始关注冲刺班的选择和费用问…

2026/8/30 7:06:07 阅读更多 →
江西高考冲刺班费用

江西高考冲刺班费用

江西高考冲刺班费用多少?南昌金博教育全日制集训费用详解 南昌金博教育是南昌本地一所专注于高三全日制冲刺集训的学校,面向江西全省招收应届高三学生及复读生,采用食宿一体、封闭管理模式进行集中备考。随着2024年高考临近,许多家…

2026/8/30 7:06:07 阅读更多 →
基于Hadoop的房价数据分析系统:从爬虫到可视化完整实现

基于Hadoop的房价数据分析系统:从爬虫到可视化完整实现

每当看到“基于 Hadoop 的房价数据分析系统”这类题目,很多同学第一反应是“技术栈会不会太多、Hold 不住”。实际上,只要把数据链路梳理清楚,这个项目可以说是性价比很高的毕设选题:既有 Python 爬虫做数据采集,又有 …

2026/8/30 7:06:07 阅读更多 →
Mac Studio与Mac mini开发者选型:统一内存与本地AI部署指南

Mac Studio与Mac mini开发者选型:统一内存与本地AI部署指南

Mac Studio 与 Mac mini 的新品预购消息出来以后,我观察到一个有意思的现象:开发者群里讨论最多的其实不是外观、不是跑分,而是两个很实际的问题——我的工作负载到底需要多大内存,以及本地的容器和模型服务能不能稳定跑起来。如果…

2026/8/30 7:05:07 阅读更多 →

日新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/30 0:00:01 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/30 0:00:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/30 0:00:01 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →