OpenHarmony NDK工具链详解:交叉编译原理与实战避坑
1. 为什么OpenHarmony需要一套自己的NDK工具1.1 从NDK这个老概念说起很多从Android转过来的同学第一次接触OpenHarmony开发时都会下意识地找NDK配置入口然后发现路径对不上、编译报错、工具链名字也不一样直接卡在环境搭建这一步。我在第一次接触OpenHarmony NDK时也经历过这个阶段所以这篇系列文章上先不急着讲花哨的API调用而是把OpenHarmony NDK这套工具本身掰开揉碎讲清楚。理解了工具链的构成和工作原理后续写Native代码时踩坑的概率会小很多。先说清楚一个概念NDK全称是Native Development Kit不是某一家公司的专属名词。Android有Android NDKOpenHarmony作为独立的操作系统自然也有自己的一套Native开发工具链。它的核心目的和Android NDK一致——让你能用C/C直接调用系统底层能力脱离ArkTS/JS上层框架写高性能代码或者把现有的C/C库FFmpeg、OpenCV、SQLite这类快速移植到OpenHarmony上。但关键在于OpenHarmony不是Android的复制品内核是自研的用户态库、C运行时、ABI规范、动态链接器都和Android不同。所以Android NDK编出来的产物不能直接在OpenHarmony上跑必须有一套针对OpenHarmony系统定制、匹配其ABI和libc接口的编译工具链。这就是OpenHarmony NDK存在的根本原因。1.2 OpenHarmony的生态多样性决定了NDK的复杂性和Android主要面向手机不同OpenHarmony面对的设备类型非常杂手机、平板、电视、智能座舱、IPC摄像头、各种IoT设备。这就带来一个很现实的工程问题——不同设备的CPU架构不一样。主流目标架构就有四类目标架构典型设备场景对应target tripletaarch64ARM 64位手机、平板、电视aarch64-linux-ohosarmARM 32位部分IoT设备arm-linux-ohosx86_64模拟器、部分平板x86_64-linux-ohosi686x86 32位老旧模拟器i686-linux-ohos如果没有一套统一的交叉编译工具链每适配一个新硬件就要从源码构建一遍编译器效率低到没法想象。OpenHarmony NDK提供的是一套一次安装、多目标编译的方案你在x86_64的Linux开发机上可以用同一套clang编译器通过加不同的target参数分别编出上面四种架构的二进制。OpenHarmony x86这个热词背后对应的需求就在这里——很多开发者在模拟器上调试时没意识到模拟器的目标架构和真机不一样编出来的库加载不进去。这个话题我在后面的翻车现场部分会详细展开。1.3 NDK和SDK的分工边界另外一个高频困惑是SDK和NDK到底有什么区别我到底该用哪套总结成一句话SDK管上层语言运行时和框架APINDK管C/C编译产物和Native接口。具体来说OpenHarmony SDK里主要包含ArkTS/JS的编译器、运行时库、应用签名工具、资源编译工具以及供应用调用的各类Framework API的声明文件。而NDK则包含C/C头文件如native窗口接口、EGL/OpenGL、native多媒体接口等、C/C运行库libc、libc、交叉编译器、链接器和CMake工具链文件。两者的交汇点在Native API层。OpenHarmony从3.x开始就逐步完善了这套Native API体系开发者可以纯用C/C写一个完整的应用也可以在上层ArkTS中通过napi机制调用C/C模块。NDK提供的原生接口覆盖了图形渲染EGL、Vulkan、OpenGL ES、多媒体AVCodec、AVCapture、窗口管理、AI推理Neural Network Runtime、文件管理等多个领域。这就意味着如果你的应用核心逻辑涉及图形渲染、音视频编解码、信号处理这类计算密集任务SDK不一定能满足性能要求这时候NDK就是必须掌握的工具。2. 拿到手先摸清家底OpenHarmony NDK工具链全景2.1 压缩包里到底装了些什么初次拿到OpenHarmony NDK的压缩包解压后很多人会对着目录结构犯晕。我建议你和我一样先把它完整列一遍心里有个底。$ tree -L 3 native -d native ├── build │ ├── cmake │ └── pkg_config ├── build-tools │ ├── cmake │ └── ninja ├── llvm │ ├── bin │ ├── lib │ └── lib64 ├── ndk-build ├── scripts ├── sysroot │ ├── usr │ └── lib └── toolchain.cmake看着复杂其实核心就三大块llvm完整的编译器工具链包括clang、clang、ld.lld、llvm-ar、llvm-strip等一整套LLVM工具。这是编译器的家。sysroot目标系统的根目录镜像里面是OpenHarmony的运行库和头文件。交叉编译时编译器要到这里找头文件和标准库。build主要放CMake工具链文件和pkg-config辅助文件工程化编译时的关键依赖。build-tools里是CMake和Ninja这两个构建工具OpenHarmony官方预打包了一份保证和工具链版本兼容。实际使用中你可以不用系统自带的CMake但要注意版本不能太老否则解析不了工具链文件里的某些写法。2.2 编译器与链接器clang和lld的分工NDK里的编译器是clang/clang链接器是LLVM项目自带的lld这两个配合非常默契。为什么OpenHarmony选LLVM而不是GCC核心原因有三个。第一LLVM是一套前后端解耦的架构前端把C/C源码翻译成统一的中间表示IR后端按目标架构生成机器码。这意味着同一套编译器可以轻松支持x86_64、aarch64、arm等多种架构不需要像GCC那样为每个目标维护独立的编译器二进制。第二LLVM的交叉编译和代码生成优化能力很强尤其在新特性支持、编译速度、错误信息可读性上都有明显优势。第三也是比较现实的原因——Android NDK早就全面转向LLVMOpenHarmony的开发者生态和工具链设计对齐这一主流方向后续很多第三方库的编译经验可以直接复用。编译器负责的是人和机器之间翻译的工作把你能读懂的C代码翻译成对应架构的汇编指令。链接器则负责把多个编译产物.o文件和库文件组合成一个可执行文件或共享库。实际运行的是一个体系缺一不可。2.3 sysroot没有它交叉编译寸步难行sysroot这个词可以这么理解交叉编译时目标设备的内存布局、系统库路径和你的开发机不一样。编译器要链接libc、libc这些基础库时不能跑到你开发机的/usr/lib里去找——那是给x86_64 Linux用的库的ABI、动态链接器都不匹配。sysroot就是给编译器指定一个假的根目录。编译器查找头文件和库时会从这个目录下开始找而不是从系统根目录找。比如OpenHarmony NDK的sysroot结构native/sysroot/usr/include # C/C 头文件 native/sysroot/usr/lib/aarch64-linux-ohos/ # ARM 64位库 native/sysroot/usr/lib/x86_64-linux-ohos/ # x86_64 库 native/sysroot/usr/lib/arm-linux-ohos/ # ARM 32位库注意库文件是按目标架构分子目录存放的。如果一个库是给aarch64用的但你用x86_64的target去链接编译器会在x86_64-linux-ohos目录下找不到对应的库文件或者找到后因为ABI不匹配而链接失败。这就是很多诡异报错的根源。2.4 C运行时库libc的差异C开发的同学要特别注意运行时库的问题。OpenHarmony NDK自带的C标准库是libc不是GCC配套的libstdc也不是某些桌面发行版默认的libstdc。这一点和Android NDK一致。libc又分为静态库libc.a和共享库libc_shared.so。如果你在CMake里设置OHOS_STLc_shared编出来的.so文件会依赖libc_shared.so应用安装时需要连这个动态库一起打包如果设置c_static则会把C标准库代码直接编进你的产物里不需要额外打包。实际项目里我建议优先用c_shared理由很实际一个应用里往往有多个Native模块如果每个模块都静态链接libc同一份C标准库代码会在内存里存在多份容易导致类型标识符不一致、异常跨模块传递崩溃类问题。共享库方式保证多个Native模块共用一份C运行时。3. 环境准备与基础配置少走弯路的三个前置步骤3.1 下载与目录规划获取OpenHarmony NDK的渠道主要有两个一是OpenHarmony官方发布包页面二是Gitee仓库的发布版本。注意区分两个容易混淆的包SDK包和NDK包。在OpenHarmony的发布体系里SDK包中也会包含NDK目录但更推荐直接下载独立的NDK压缩包它更精简不包含ArkTS编译那套东西。下载版本时我强烈建议优先选择和你目标DevEco Studio配套的NDK版本。OpenHarmony 5.0.x对应的NDK是5.0.x系列不要混用否则可能出现Native API头文件版本高于系统版本、某些接口在真机上找不到的情况。最稳妥的做法是在DevEco Studio的SDK管理里看到哪个版本与当前IDE匹配就去官网下载哪个版本。目录规划这件事看起来鸡毛蒜皮但踩过坑的人会懂我的强迫症有多必要路径不要带空格和中文有些第三方编译脚本处理不了带空格路径报错时排查半天记住NDK根目录的绝对路径后面配置环境变量和CMake都会用到我的习惯是统一放在用户目录下mkdir -p ~/ohos/ndk cd ~/ohos/ndk # 假设下载的是 ohos-ndk-linux-5.0.0.zip unzip ohos-ndk-linux-5.0.0.zip # 解压后目录结构类似 # ls native3.2 设置环境变量配置环境变量的核心是避免每次敲命令都写一长串绝对路径。我一般配置两个变量OHOS_NDK_HOME和PATH。# 编辑 ~/.bashrc 或 ~/.zshrc export OHOS_NDK_HOME$HOME/ohos/ndk/native export PATH$OHOS_NDK_HOME/llvm/bin:$OHOS_NDK_HOME/build-tools/cmake/bin:$OHOS_NDK_HOME/build-tools/ninja:$PATH设置完成后验证工具链是否可用$ clang --version正常输出会显示OpenHarmony定制编译的clang版本信息。如果你看到类似clang version 17.0.4这类输出说明编译器路径已经生效。我在这一步容易出错的是终端环境变量设置后DevEco Studio里的终端或独立IDE打开的shell不会自动加载新的.bashrc看起来像是配置失效。解决办法是重启终端或者在IDE的设置里重新指定shell环境。3.3 DevEco Studio里的NDK配置入口如果你主要在DevEco Studio里做开发还需要在IDE里把NDK路径指对。具体入口是File Project Structure SDK Location在Native Development Kit区域点右侧的编辑图标填入NDK根目录注意是包含native子目录的上一层路径即~/ohos/ndk不是~/ohos/ndk/native。这里最容易搞混的一点在于IDE认识的NDK路径和你自己命令行使用的OHOS_NDK_HOME指向的目录层级不一样。命令行用得是native目录下的llvm/bin而IDE需要你选择NDK包的根目录。配置完成后建议先在IDE里新建一个native C的工程模板跑通再开始自己的项目。这一步能验证IDE、NDK、构建脚本三者的通道是否打通。如果这一步编译报错优先检查NDK版本和DevEco Studio版本是否配套。4. 手写一次交叉编译从源码到可执行文件4.1 先写一个最简单的Native程序理解工具链最直接的方式是抛开IDE和CMake手写命令行做一次完整的交叉编译。先准备一个最简单的C程序// hello.c #include stdio.h int main(void) { printf(Hello OpenHarmony NDK\n); return 0; }注意我用了printf它会调libc的输出函数。这能验证编译器能正确找到sysroot里的头文件和libc库。4.2 命令行的每一个参数都代表什么用下面这条命令编译出aarch64架构的可执行文件clang \ --targetaarch64-linux-ohos \ --sysroot$OHOS_NDK_HOME/sysroot \ -o hello_arm64 \ hello.c一眼看上去就三个关键信息逐个拆开解释--targetaarch64-linux-ohos是告诉编译器我为aarch64架构的OpenHarmony设备编译。这个三元组由CPU架构-操作系统-ABI三部分组成。中间省略了一个可选的-gnu等字符串所以看起来是aarch64-linux-ohos而不是aarch64-linux-gnu-ohos。--sysroot$OHOS_NDK_HOME/sysroot是告诉编译器去哪里找OpenHarmony的头文件和库。前面说过sysroot就是目标系统的假根目录。-o hello_arm64指定输出文件名。编译完成后用file命令检查产物$ file hello_arm64 hello_arm64: ELF 64-bit LSB executable, ARM aarch64, dynamically linked, not stripped看到ARM aarch64就说明编译目标是对了。4.3 静态链接与动态链接的选择前面hello_arm64默认是动态链接的会依赖设备上的libc.so。想验证动态链接器的依赖关系可以用readelf -l hello_arm64 | grep interp查看输出中会包含/system/lib/ld-musl-aarch64.so.1之类的路径这是OpenHarmony的musl libc动态链接器。如果编出来的程序不想依赖设备上的动态库可以加-static参数做静态链接clang \ --targetaarch64-linux-ohos \ --sysroot$OHOS_NDK_HOME/sysroot \ -static \ -o hello_arm64_static \ hello.c两种方式各有取舍我用一张表总结链接方式产物体积运行时依赖适配性典型场景动态链接小依赖设备系统库系统库版本一致即可二进制更小大型Native库、系统组件静态链接大无外部依赖在较老或特殊系统版本上更安全工具类小程序、调试程序实际编译库给其他模块用时通常是编成动态库.so链接方式选择动态以减小应用包体积。但如果你的目标是写一个诊断工具直接推到设备上跑静态链接能省掉很多系统库兼容性的烦恼。5. CMake工具链文件工程化编译的正确姿势5.1 为什么命令行编译只适合教学我在第4章演示命令行编译目的是帮你理解交叉编译的底层原理target、sysroot、头文件和库是怎么被编译器找到的。但真实项目如果你还在手写clang命令那是在给自己找麻烦。主要原因有三个第一一个真实项目通常有几十上百个源文件手写编译命令基本不可维护第二依赖管理和链接参数会越来越复杂第三IDE要识别项目结构、代码跳转、调试信息都需要标准化的项目定义文件。CMake是目前OpenHarmony Native工程事实上的标准构建系统。它的作用不是帮你编译而是帮你生成编译系统所需的文件和规则让底层的ninja或make去执行。5.2 ohos.toolchain.cmake 关键变量详解OpenHarmony NDK带了官方的CMake工具链文件路径在$OHOS_NDK_HOME/build/cmake/ohos.toolchain.cmake。使用CMake时不需要自己写复杂的编译器检测和sysroot查找逻辑只要在配置时指定这个工具链文件即可cmake \ -DCMAKE_TOOLCHAIN_FILE$OHOS_NDK_HOME/build/cmake/ohos.toolchain.cmake \ -DOHOS_ARCHarm64-v8a \ -DOHOS_PLATFORMOHOS \ -DOHOS_STLc_shared \ -DCMAKE_BUILD_TYPERelease \ -B build这几个参数的含义我要重点强调它们是NDK配置时最容易混淆的地方OHOS_ARCH指定目标CPU架构可选值和target的对应关系如下OHOS_ARCH对应架构target triplet典型场景arm64-v8aARM 64位aarch64-linux-ohos手机、平板armeabi-v7aARM 32位arm-linux-ohos老旧IoT设备x86_64x86 64位x86_64-linux-ohos模拟器x86x86 32位i686-linux-ohos老模拟器OHOS_PLATFORM指定目标系统名统一填OHOS即可。这个参数决定sysroot里查找库文件的子目录路径填错会导致找不到基础库。OHOS_STL指定C标准库链接方式可选c_static或c_shared。前面说过推荐c_shared。另外建议显式指定CMAKE_BUILD_TYPE。不指定的话默认是空字符串不会有优化参数编出来的库性能会明显偏差尤其在图形渲染、算法计算这类场景下。5.3 一个实际CMakeLists.txt示例下面是我在写Native库时常用的一个基础模板cmake_minimum_required(VERSION 3.15) project(mylib VERSION 1.0 LANGUAGES C CXX) # 指定C标准OpenHarmony工具链支持到C17 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 当前源目录下的源代码 add_library(mylib SHARED src/my_module.cpp src/helper.cpp ) # 指定头文件搜索路径 target_include_directories(mylib PUBLIC include ) # 链接额外依赖比如log库 target_link_libraries(mylib PUBLIC log )编译时cmake \ -DCMAKE_TOOLCHAIN_FILE$OHOS_NDK_HOME/build/cmake/ohos.toolchain.cmake \ -DOHOS_ARCHarm64-v8a \ -DOHOS_PLATFORMOHOS \ -DOHOS_STLc_shared \ -DCMAKE_BUILD_TYPERelease \ -B build/arm64-v8a cmake --build build/arm64-v8a -j$(nproc)编出来的产物在build/arm64-v8a/libmylib.so。注意这里我特意为不同架构建了不同的构建目录因为CMake一旦用某个工具链配置过构建目录生成的规则就固定了。如果你需要同时输出armeabi-v7a和arm64-v8a两个版本的库建议每个架构单独一个build目录互不干扰。这是我实测中比较高效率的做法比反复删除build目录重建省事很多。6. 工具链相关的经典翻车现场与排查思路6.1 模拟器上编译出的OpenHarmony x86库加载不进真机我先说一个我踩过的坑也是网上讨论热度非常高的场景。你在DevEco Studio里新建Native C工程时默认跑在模拟器上模拟器的CPU架构是x86_64。IDE会选择x86_64的目标编译。一切正常。但当你把这个库迁移到ARM真机上时系统加载.so文件会直接报错类似dlopen failed: cannot locate symbol或者has wrong ELF class。排查链路的完整思路应该是这样# 第一步检查.so归属架构 file libmylib.so # 第二步检查.so依赖的共享库文件 readelf -d libmylib.so | grep NEEDED # 第三步检查是否会解析到意外的符号 nm -D libmylib.so | grep 你关心的函数名file命令输出里如果写着x86-64那内容再对也跑不到ARM设备上。有些同学不看架构直接拿错误日志去搜索结果搜到的是应用层逻辑问题绕了一大圈。先验证文件架构是最高效的动作。解决方案分两种情况如果只在模拟器上调试继续用x86_64没问题如果要上真机CMake命令里把OHOS_ARCH改为arm64-v8a重新编一份。一个工程输出多架构库建议写一个脚本遍历架构列表把构建命令统一跑一遍。6.2 画面渲染异常不等同于改图形代码我在排查一个渲染异常问题时花了一整个下午在查OpenGL ES调用和EGL表面配置最后发现根因根本不在应用层——我用错x86_64架构的EGL库加载到了ARM设备上GPU驱动接口版本和库版本不匹配导致画面花屏、纹理错乱。这类OpenHarmony画面渲染异常相关的坑很可能出在NDK工具链层面而不是渲染逻辑上。正确做法是先确认你工程里Native模块的目标架构和设备一致检查EGL、Vulkan等图形相关库是否都来自同一个编译架构再看系统库版本是否和NDK版本匹配。排查时可以这样操作把崩溃现场附近的日志拉出来看如果能看到libEGL_*.so加载紧凑的特征符号说明问题指向库的ABI不匹配或版本冲突。此时再回头审视工具链配置往往比直接改shader效率高得多。6.3 sysroot路径错误导致的隐藏符号问题第三种翻车场景隐蔽性更高。你在交叉编译时如果--sysroot参数没传或者路径填错clang默认会退回宿主机的系统头文件和库。在x86_64的开发机上它能编出一个x86_64 Linux的产物这在某些情况下不报错但运行时就是各种崩溃、找不到符号。这种错误最坑的是编译过程完全正常没有任何警告。我当时的排查思路是用readelf -d看NEEDED条目发现产物依赖了宿主机特有的libm.so.6而不是OpenHarmony系统的musl库。用readelf -l查看interp段看到的是/lib64/ld-linux-x86-64.so.2而不是OpenHarmony的ld-musl-x86_64.so.1。解决办法就是编译时强制指定sysroot。如果用的CMake工具链文件工具链文件内部已经帮你处理了sysroot传参不需要手动加。如果自己手写Makefile或命令--sysroot参数必须写完整不要用省略路径。6.4 libc_shared.so 没打包导致的运行时崩溃最后一个高频坑和链接器无关而是打包环节。我在工程里设置了OHOS_STLc_shared后编译一切正常但推到设备上运行时直接报dlopen failed: library libc_shared.so not found。原因很简单编译时用了动态C运行时库但应用打包时没有把这个库一起带进去。排查和解决的思路如下先去NDK的sysroot目录里找到这个库文件$OHOS_NDK_HOME/sysroot/usr/lib/aarch64-linux-ohos/libc_shared.so。然后在模块的构建配置里显式声明要打包这个库。具体方式取决于构建工具用CMake时可以在CMakeLists里通过install规则加入或者用DevEco Studio的模块配置界面添加依赖。不设置的话很多初学者会栽在这里。7. 上篇的最后一件事先跑通最小Native示例把前面六章从头看到这里核心的工具链概念和环境配置基本都有数了。但有一件事我想单独强调无论看了多少分析都不如先跑通一个最小Native示例来帮助建立信心。你在DevEco Studio新建Native C工程它默认生成了一个很简单的hello world模块。第一次编译通过并成功运行后建议你手动改一改它比如加一个C类、做一个简单的计算功能再用hilog打印结果。这个小动作能验证你对工具链的理解是否真正落地。我在这个阶段比较大的体会是交叉编译难的不是语法而是为错误的目标架构或系统编译出产物这个错误本身不报错只有到设备运行时才暴露。多使用file和readelf作为日常工具随时检查产物比什么技巧都重要。上篇讲到编译链路的个人经验基本到这里。后续内容中我计划把Native API里的EGL/Vulkan渲染集成、napi封装、多架构打包、调试工具这几个方向再单独成篇展开。你先按上面步骤跑通最小示例有任何和工具链本身相关的报错大概率都能在上面的排查思路里找到方向。

相关新闻

Java多支付平台整合设计:策略模式与工厂模式实战指南

Java多支付平台整合设计:策略模式与工厂模式实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 8:57:06 阅读更多 →
TMC2208电机驱动芯片详解:静音原理、接线电流与UART配置

TMC2208电机驱动芯片详解:静音原理、接线电流与UART配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 8:57:06 阅读更多 →
ORCA多智能体避碰算法:从速度障碍到RVO2实战全解

ORCA多智能体避碰算法:从速度障碍到RVO2实战全解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 8:57:06 阅读更多 →

最新新闻

混元OCR 1.5的1B模型如何实现0.7页/秒?DFlash、vLLM与RL的工程实践

混元OCR 1.5的1B模型如何实现0.7页/秒?DFlash、vLLM与RL的工程实践

1. 从一张“0.7 页/秒”的截图说起前阵子群里有人甩出一张截图,说混元 OCR 1.5 用 1B 的模型把识别速度干到了 0.7 页/秒,底下配了一句“榜单第一”。我第一反应不是惊叹,而是习惯性地去翻它的测试条件——单页多少字、什么分辨率、什么硬件、…

2026/10/1 9:45:28 阅读更多 →
AI工业控制系统搭建实战:从数据采集到闭环控制

AI工业控制系统搭建实战:从数据采集到闭环控制

1. 从零理解AI工业控制系统的真实边界1.1 这套系统到底解决什么问题先把概念说清楚。AI工业控制系统,不是把PLC、DCS全部推倒重来换成神经网络,而是在原有控制链路之上,叠加一层“感知—预测—决策—下发”的智能闭环。传统工控系统擅长的是确…

2026/10/1 9:45:28 阅读更多 →
复变函数与积分变换:留数定理与三大变换工程实战

复变函数与积分变换:留数定理与三大变换工程实战

1. 先搞清楚这门课到底在讲什么很多人学复变函数与积分变换,学到一半会有种很奇怪的割裂感:前半本的复数、解析函数、留数定理,像是一门纯数学课,画个圆、算个留数、证个定理;后半本的傅里叶变换、拉普拉斯变换、Z变换…

2026/10/1 9:45:28 阅读更多 →
机载电磁环境有多复杂?DO‑160G 射频敏感度与射频发射试验解析

机载电磁环境有多复杂?DO‑160G 射频敏感度与射频发射试验解析

机载空间里密布雷达、通信电台、各类电子设备,设备之间互相干扰,轻则信号异常,重则威胁飞行安全。DO-160G中射频敏感度、射频能量发射两大试验,属于机载EMC核心项目,分别对应抗外界射频干扰,以及自身不能向…

2026/10/1 9:45:28 阅读更多 →
AI agent 生产级地基:图编排、沙箱与记忆系统实战

AI agent 生产级地基:图编排、沙箱与记忆系统实战

1. 从热榜前五看 AI agent 的“地基焦虑”9 月 22 日这天的 GitHub Trending 榜单,我刷到的时候愣了一下——前五名里三个项目,方向出奇地一致:都在给 AI agent 造地基。不是又一个套壳聊天界面,不是又一个“一键生成 PPT”的玩具…

2026/10/1 9:45:28 阅读更多 →
RomM 固件一次放对,GBA 黑屏即刻修复

RomM 固件一次放对,GBA 黑屏即刻修复

RomM 固件一次放对,GBA 黑屏即刻修复 【免费下载链接】romm A beautiful, powerful, self-hosted ROM manager and player. 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 点开 GBA 游戏,画面卡在开机前的黑屏,模拟器提示&…

2026/10/1 9:44:28 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →