用 Android.mk 的写法组织 CMake:让跨平台 C++ 构建更像填表

一、为什么要再封一层 CMake CMake 很强,但刚开始接触时也很容易写乱。 比如我们想做一件很普通的事:写一个 hello object library,再写一个 basic_hello_world 可执行程序去使用它。原生 CMake 可能会这样写: add_library(hello OBJECT hello/src/hello.cpp) target_include_directories(hello PUBLIC hell…

Harness Engineering 入门指南:让 AI 稳定干活

大模型已经很会写代码了,但真正用起来以后,很多人会遇到一个尴尬问题:它能很快生成一大堆东西,却不一定稳定、可维护、符合项目约定。 第一次看起来很惊艳,第二次开始风格漂移,第三次改坏旧逻辑,第四次你发现自己在给 AI 生成的代码收拾现场。于是效率提升没有想象中那么大,问题从“我写代码慢”变成了“我审 AI 代码很累”。 Harness Engineering 要解决的就是这个问题。 它不是一个新框架,也不是某个插件,而是一种使用 AI A…

xdebug:一个面向跨平台 Native 服务的 TCP 调试入口

很多 Native 服务一旦跑起来,最难处理的不是"有没有日志",而是"我现在能不能在不中断进程的情况下问它几个问题"。 比如一个投屏服务、音视频服务或嵌入式后台任务,现场经常需要临时确认: 当前模块是否还活着。 编码器参数是否按预期生效。 某个状态机卡在哪一步。 是否可以临时触发一次 IDR、刷新、重连或 dump。 日志之外的运行时状态能不能直接读出来。 只靠日志不够。日志是被动输出,调试入口是主动查询。xdebug 的目标就…

一切皆文件,epoll 事件驱动编程与实用技巧

epoll 经常被介绍成"高性能网络 I/O 多路复用接口",这句话没错,但它只讲了最常见的一半用法。 在真实工程里,epoll 更像一个统一的事件入口。网络读写、退出通知、信号处理等事件都可以汇入同一个 wait 点,主线程只需要围绕这个 wait 点做分发,而不必在多个阻塞点和轮询逻辑之间来回切换。 这篇文章会围绕 Linux "一切皆文件" 的设计思想,整理几个 epoll 的实用技巧: 用 socketpair 或 signa…

C++ 崩溃栈回溯:从原理到工具,手把手教你看懂 crash

一、问题背景 C++ 程序线上崩溃时,最常见的日志可能只有一句: Segmentation fault (11) 这句话只告诉我们程序收到了 SIGSEGV,也就是访问了不该访问的内存。但它没有告诉我们: 崩溃发生在哪个函数。 这个函数是谁调用的。 对应源码文件和行号是什么。 线上 release 二进制被 strip 后还能不能还原现场。 crashtrace 这个仓库就是为了解决这个问题:它把 C++ 崩溃栈能力拆成一套小型库、…