GNU M4 1.4.19 源码编译与 Autotools 构建实战指南

简介:m4-1.4.19.tar.gz 是 Linux 环境下经典宏处理器 m4 的官方源码发布包,面向需要理解 autoconf 构建机制、编写配置脚本或搭建轻量模板系统的开发者与运维人员。压缩包共 1670 个文件,约 2.82MB,以 558 个 C 源文件、268 个头文件构成核心实现,334 个 .m4 文件与 72 个 shell 脚本承载宏示例、测试用例和构建逻辑,另有 26 个 po/gmo 本地化文件及大量以 changequote、divert、ifelse、patsubst 等命名的测试片段,完整覆盖宏定义、条件控制、文本操作等知识点。目前已有 596 人学习下载。解压后可通过 configure、make、make install 完成编译安装,既能对照源码理解宏展开与递归处理原理,也能借助测试用例排查实际使用中的转义、引用与参数传递问题,适合作为学习 Linux 文本预处理与构建工具链的实践素材。

1. 从 m4-1.4.19.tar.gz 说起:一个被低估的构建基石

如果你在编译 GNU Autotools 工具链、构建嵌入式根文件系统,或者从源码编译某个老牌 C 项目时,终端突然甩出一句configure: error: GNU M4 1.4.6 or later is required,那你大概率会去下载一个叫m4-1.4.19.tar.gz的压缩包。这个不到 2MB 的 tarball,是 GNU M4 宏处理器的 1.4.19 版本源码包,也是整个 Autoconf/Automake/Libtool 体系里最底层、最容易被忽略、却最不能出错的一环。它解决的问题很纯粹:把宏展开这件事做到可移植、可复现、可自举。适合谁?适合所有需要从源码构建 C/C++ 项目、维护交叉编译工具链、或者被aclocal和autoreconf折磨过的工程师。这一章不急着敲命令,先把“为什么一个宏处理器能卡住整条构建链”讲清楚。

M4 本身不是编译器,也不是构建系统,它是一个通用的宏处理器。Autoconf 生成的configure脚本本质上是一大段 M4 宏展开后的 shell 代码,aclocal.m4、configure.ac里的AC_INIT、AM_INIT_AUTOMAKE这些宏,最终都要靠 M4 来展开成可执行的 shell 语句。所以当 M4 版本过低、缺失、或者被错误地替换成 BSD 版 m4 时,autoreconf -fi就会在某个看似无关的宏上翻车。1.4.19 是 1.4.x 系列里较新的稳定版本,修复了早期版本在大型宏展开时的栈溢出和部分平台上的兼容性问题。很多人第一次接触它,是因为系统自带的 m4 太老,而项目又要求 1.4.6 以上;第二次接触它,往往是因为交叉编译时 host 和 target 的 m4 混用,导致 configure 脚本生成结果诡异。理解这个 tarball 的定位,比记住解压命令重要得多。

2. 把 m4-1.4.19.tar.gz 在本地跑通:从解压到自举的完整链路

2.1 先确认你手里的是源码包而不是二进制包

m4-1.4.19.tar.gz是 GNU 官方发布的源码 tarball,不是预编译二进制。它的典型结构是顶层目录m4-1.4.19/,里面包含configure、Makefile.in、src/、lib/、tests/等。拿到包之后第一件事不是直接./configure,而是先校验完整性,避免下载中断导致解压后缺文件。常见做法是用sha256sum或gpg --verify对照官方签名,但如果你只是本地构建,至少确认configure文件存在且可执行。

# 解压并进入源码目录 tar -xzf m4-1.4.19.tar.gz cd m4-1.4.19 # 确认关键文件存在 ls -l configure Makefile.in src/m4.c

逻辑说明:tar -xzf中-x解压、-z走 gzip、-f指定文件。ls这一步不是形式主义,很多“configure 找不到”的问题其实是 tarball 解压不完整,尤其是通过某些下载工具断点续传后得到的包。参数上,如果你在 macOS 上解压,注意 BSD tar 和 GNU tar 对长路径的处理差异,建议用gnu-tar或直接tar -xzf即可。

2.2 configure 阶段:三个必须显式指定的参数

M4 的configure脚本支持大量参数,但真正影响后续构建稳定性的,主要是安装路径、构建类型和是否启用本地库。我一般会显式指定--prefix,避免默认装到/usr/local后和系统自带 m4 冲突。如果你是在容器或 CI 里构建,建议把 prefix 设到一个独立目录,比如/opt/m4-1.4.19,这样后续可以整体打包或删除。

./configure \ --prefix=/opt/m4-1.4.19 \ --disable-dependency-tracking \ --enable-static \ --enable-shared

逻辑说明:--prefix决定make install的落点;--disable-dependency-tracking在一次性构建场景下能加快速度,但如果你要反复改源码重新编译,建议去掉;--enable-static和--enable-shared同时开启,方便后续被其他项目链接。参数上,--disable-dependency-tracking不是必须的,但在 CI 里能减少对编译器依赖生成的支持要求。如果你在交叉编译,还需要加--host=arm-linux-gnueabihf这类参数,并且确保CC指向交叉编译器。

2.3 make 与 make install:并行编译和安装路径的坑

configure通过后,make阶段通常很快,因为 M4 本身代码量不大。但这里有一个血泪经验:不要盲目用make -j$(nproc),尤其是在内存较小的虚拟机上。M4 的src/目录下有些文件编译时内存占用不低,并行度过高会触发 OOM,表现为cc1: out of memory或直接进程被杀。我一般先用make -j2试,稳定后再提高。

# 先串行编译一遍,确认无错误 make -j2 # 安装到指定 prefix make install # 验证安装结果 /opt/m4-1.4.19/bin/m4 --version

逻辑说明:make -j2是保守并行度,适合大多数开发机;make install会把m4二进制、man 手册和部分头文件安装到 prefix 下。--version输出应显示m4 (GNU M4) 1.4.19。如果你看到的是系统自带的 1.4.6 或 1.4.17,说明 PATH 里系统路径优先,需要把/opt/m4-1.4.19/bin放到 PATH 前面,或者在后续 configure 时用M4=/opt/m4-1.4.19/bin/m4显式指定。

2.4 让 Autoconf 用上你刚编译的 M4

编译完 M4 只是第一步,真正要解决的是让autoreconf、aclocal、autoconf找到这个新版本。常见做法是设置M4环境变量,并在autoreconf时传递。注意,aclocal会调用autom4te,而autom4te内部会调用m4,所以只设置M4不一定够,还需要确保PATH顺序正确。

export PATH=/opt/m4-1.4.19/bin:$PATH export M4=/opt/m4-1.4.19/bin/m4 # 在目标项目里重新生成 configure autoreconf -fi # 确认 autom4te 用的是新 m4 autom4te --version | head -n 1

逻辑说明:PATH前置保证which m4指向新版本;M4变量是 Autoconf 识别 m4 路径的标准方式;autoreconf -fi中-f强制重新生成、-i安装缺失的辅助文件。autom4te --version第一行会显示它调用的 Perl 模块版本,但真正验证 m4 版本可以在configure.ac里加AC_CHECK_PROG或者直接看config.log里m4的路径。参数上,如果你不想污染全局 PATH,可以在项目 Makefile 里局部导出,或者用env PATH=... autoreconf -fi一次性执行。

3. 交叉编译与多版本共存:m4-1.4.19 的选型与隔离策略

3.1 为什么系统自带 m4 经常不够用

很多 Linux 发行版自带的 m4 版本停留在 1.4.6 到 1.4.18 之间,而一些较新的 Autoconf 版本(比如 2.71 以上)在展开复杂宏时对 m4 的栈深度和正则表达式支持有更高要求。系统 m4 还可能是 BSD m4 的兼容实现,在patsubst、regexp等 GNU 扩展上行为不一致。这就是为什么你会在config.log里看到m4: unrecognized option或者宏展开结果里多出奇怪的空行。选型上,1.4.19 是 1.4.x 系列里较稳妥的版本,既不像 2.0 分支那样有较大行为变化,又比 1.4.6 修复了大量边界问题。

3.2 用独立 prefix 做多版本隔离

如果你同时维护多个项目,有的依赖系统 m4,有的要求 1.4.19,最稳妥的方式是每个版本装到独立 prefix,然后通过环境变量切换。不要试图用update-alternatives去覆盖系统 m4,因为系统包管理器可能依赖它,覆盖后容易导致dpkg或rpm相关脚本出错。我一般会在~/.bashrc里写一个函数,按项目切换。

# 定义切换函数 use_m4_1419() { export PATH=/opt/m4-1.4.19/bin:$PATH export M4=/opt/m4-1.4.19/bin/m4 echo "M4 switched to: $(which m4)" } use_m4_system() { export PATH=$(echo $PATH | tr ':' '\n' | grep -v '/opt/m4-1.4.19/bin' | paste -sd ':' -) unset M4 echo "M4 switched to: $(which m4)" }

逻辑说明:use_m4_1419把独立 prefix 插到 PATH 最前,并设置M4;use_m4_system用tr和paste把 PATH 里的独立 prefix 剔除,恢复系统默认。参数上,grep -v是过滤掉指定路径,paste -sd ':'把多行重新拼成冒号分隔。这个函数适合放在 shell 配置里,但注意如果你在脚本里用,需要source而不是直接执行。

3.3 交叉编译时 host 与 target 的 m4 不能混

交叉编译场景下,configure脚本本身是在 host 上运行的,所以它调用的 m4 必须是 host 可执行的版本,而不是 target 架构的 m4。很多人会误以为要把 target 的 m4 装到 sysroot 里给 configure 用,结果就是cannot execute binary file。正确做法是:host 上编译并安装一份 1.4.19,target 的根文件系统里如果需要 m4,再单独交叉编译一份装进去。两者互不干扰。

# host 上构建 m4-1.4.19 ./configure --prefix=/opt/host-m4-1.4.19 make -j2 && make install # 交叉编译 target 版本(示例工具链前缀) ./configure \ --host=arm-linux-gnueabihf \ --prefix=/opt/target-m4-1.4.19 make -j2 && make install DESTDIR=/path/to/rootfs

逻辑说明:host 版本用于运行autoreconf和configure;target 版本用于目标板上的运行时需求。DESTDIR是安装到临时根目录,方便打包进文件系统镜像。参数上,--host指定目标架构,--build通常自动检测,不需要显式写。如果你在构建工具链时把 m4 作为依赖,注意先构建 host 版本,再构建 target 版本,顺序反了会导致工具链构建失败。

4. 避坑与排查:m4-1.4.19 构建和使用中的 5 个真实翻车点

4.1 现象:configure 报 “m4: command not found”,但明明已经 make install

原因:make install装到了/usr/local/bin,而当前 shell 的 PATH 里没有这个路径,或者 PATH 顺序里系统路径优先。解决:用which m4和echo $PATH确认实际调用的是哪个;如果 prefix 是/usr/local,检查/etc/profile或~/.bashrc是否包含/usr/local/bin。更稳妥的做法是显式指定M4=/usr/local/bin/m4再运行autoreconf。

4.2 现象:make 阶段报 “undefined reference to `__stack_chk_fail'”

原因:在某些嵌入式工具链或老版本 glibc 环境下,默认开启了 stack protector,但链接时缺少对应库。解决:在configure时加CFLAGS="-fno-stack-protector",或者确保工具链的 sysroot 里有libssp。这不是 m4 本身的问题,而是构建环境不完整。我一般会在交叉编译时先跑一个最小 hello world 确认工具链可用,再编译 m4。

4.3 现象:autoreconf 后生成的 configure 脚本比原来大很多,且执行变慢

原因:新版本 m4 展开宏时保留了更多调试信息,或者autom4te.cache没有清理。解决:删除autom4te.cache目录后重新运行autoreconf -fi;如果还慢,检查configure.ac里是否有大量未展开的自定义宏。参数上,autoreconf -fi的-f会强制重新生成,但不会自动清理缓存,需要手动rm -rf autom4te.cache。

4.4 现象:在 macOS 上编译 m4-1.4.19 时,tests 阶段大量失败

原因:macOS 自带 BSD 工具链,部分 GNU 扩展行为不同,尤其是sed和grep。解决:用 Homebrew 安装gnu-sed和grep,并把PATH指向它们;或者直接make -k跳过测试,只安装二进制。但注意,跳过测试可能导致某些平台相关 bug 被带入,生产环境建议至少跑一遍make check并记录失败项。

4.5 现象:系统包管理器升级后,自己编译的 m4 被覆盖或 PATH 被重置

原因:某些发行版在升级autoconf或m4包时会重写/usr/local/bin下的符号链接,或者修改/etc/environment。解决:把独立 prefix 放到用户级目录,比如~/opt/m4-1.4.19,并在项目构建脚本里显式导出 PATH 和 M4,不依赖全局配置。这样即使系统升级,也不会影响你的构建环境。

5. 进阶技巧:用 m4-1.4.19 做宏展开调试与版本锁定

5.1 用 m4 的调试选项定位 Autoconf 宏展开问题

M4 本身提供了-d系列调试选项,但在 Autoconf 场景下,更常用的是autom4te的--trace和--debug。如果你遇到某个宏展开结果不符合预期,可以先用m4 -dV看宏调用栈,但注意 Autoconf 的宏层数很深,直接看 m4 调试输出会非常冗长。我一般会先在configure.ac里用m4_pattern_forbid和m4_pattern_allow限制未展开宏,再配合autom4te --trace=AC_INIT这类定向追踪。

# 在项目目录下追踪 AC_INIT 宏展开 autom4te --trace=AC_INIT --language=Autoconf configure.ac # 如果只想看 m4 层面的展开,可以用: /opt/m4-1.4.19/bin/m4 -dV configure.ac > /dev/null 2> m4-debug.log

逻辑说明:autom4te --trace会输出宏被调用时的参数和位置,适合定位“为什么这个宏没展开”;m4 -dV输出详细调试信息到 stderr,重定向到日志后可以用grep过滤。参数上,-d后面跟V表示 verbose,还可以用-d t追踪宏调用、-d i显示输入文件。注意,直接对configure.ac跑 m4 通常会报错,因为它依赖 Autoconf 预定义的宏,所以这个命令更多是用于理解 m4 行为,而不是替代autoreconf。

5.2 版本锁定:在 CI 里固定 m4-1.4.19 的校验和

如果你在 CI 里构建项目,建议把m4-1.4.19.tar.gz的 SHA256 写进脚本,下载后先校验再解压。这样能避免上游文件被替换或下载到损坏包。同时,把编译好的 m4 缓存到 CI 的 cache 目录,避免每次流水线都重新编译。我一般会在 CI 脚本里写一个ensure_m4()函数,先检查/opt/m4-1.4.19/bin/m4是否存在且版本正确,不存在再走下载、校验、编译、安装流程。

# CI 中固定版本并校验 M4_VERSION=1.4.19 M4_SHA256="expected_sha256_here" M4_TARBALL="m4-${M4_VERSION}.tar.gz" if [ ! -x "/opt/m4-${M4_VERSION}/bin/m4" ]; then curl -LO "https://example.invalid/m4-${M4_VERSION}.tar.gz" echo "${M4_SHA256} ${M4_TARBALL}" | sha256sum -c - tar -xzf "${M4_TARBALL}" cd "m4-${M4_VERSION}" ./configure --prefix="/opt/m4-${M4_VERSION}" --disable-dependency-tracking make -j2 && make install fi export PATH="/opt/m4-${M4_VERSION}/bin:$PATH" export M4="/opt/m4-${M4_VERSION}/bin/m4"

逻辑说明:sha256sum -c -从标准输入读取校验和并验证文件;if [ ! -x ... ]判断二进制是否存在且可执行,避免重复编译。参数上,--disable-dependency-tracking在 CI 里能减少对编译器依赖生成的要求;make -j2是保守并行度,防止 CI 容器内存不足。注意,示例里的下载地址是占位符,实际使用时替换为可用的源码获取方式,并确保校验和来自可信渠道。

5.3 一个容易被忽略的细节:m4 的栈大小与 ulimit

M4 在处理超大宏时依赖递归,如果系统ulimit -s设置过小(比如 1MB),可能在展开 Autoconf 宏时触发栈溢出,表现为m4: stack overflow或直接段错误。我一般会在构建前检查ulimit -s,如果是 8192 或更大,通常没问题;如果是 1024,建议临时调到 8192 以上。这个坑在容器里尤其常见,因为很多基础镜像默认栈大小偏小。

# 查看当前栈大小 ulimit -s # 临时调大(仅当前 shell 有效) ulimit -s 16384

逻辑说明:ulimit -s单位是 KB,16384 表示 16MB。这个设置只影响当前 shell 及其子进程,不会持久化。如果你在 CI 里遇到随机段错误,可以先在脚本开头加ulimit -s 16384试试。参数上,不要设得过大,否则可能触发系统级限制;一般 8192 到 16384 足够 Autoconf 使用。

5.4 验证 m4-1.4.19 是否真正生效的三种方法

第一种,直接m4 --version看输出;第二种,在config.log里搜索m4路径,确认 configure 实际调用的是哪个;第三种,写一个最小configure.ac,用AC_INIT和AC_OUTPUT生成一个空configure,然后看生成脚本里是否有新版本 m4 特有的展开痕迹。我一般用第二种,因为config.log会记录configure运行时所有关键工具的路径和版本,是最可靠的黑匣子。

# 在项目构建后检查 config.log grep -n "m4" config.log | head -n 20 # 或者直接看 autoreconf 的详细输出 autoreconf -fi -v 2>&1 | grep -i m4

逻辑说明:grep -n显示行号,方便定位;autoreconf -v输出详细过程,能看到它调用的autom4te和m4路径。参数上,-v是 verbose,-fi是强制重新生成并安装辅助文件。如果你发现config.log里的 m4 路径还是系统路径,说明环境变量没生效,需要回到第 2 章检查 PATH 和 M4 的设置。

我自己在维护一个跨平台构建脚本时,曾经因为 CI 容器里系统 m4 是 1.4.17 而项目要求 1.4.19,导致autoreconf随机失败。后来把 m4-1.4.19 编译进独立 prefix,并在脚本开头强制ulimit -s 16384,问题才彻底消失。从那以后,我养成了一个习惯:任何依赖 Autotools 的项目,先确认 m4 版本和栈大小,再谈其他。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

SpringBoot+Vue图书馆管理系统:从数据库设计到前后端实现

SpringBoot+Vue图书馆管理系统:从数据库设计到前后端实现

SpringBoot Vue 做管理系统,放在 2025 年已经不算什么新鲜组合,但每次看到这种自带完整源码和数据库的图书馆管理系统,我还是愿意认真拆一拆。因为“管理系统”三个字看着简单,真要把借书、还书、逾期、统计这一整套流程切得干净…

2026/10/20 20:41:20 阅读更多 →
PCA+SVR组合预测:高维特征压缩与回归建模实战指南

PCA+SVR组合预测:高维特征压缩与回归建模实战指南

最近在做某设备的性能预测项目,手里攒了十几个传感器特征,从温度、压力、振动到电流,看起来信息很全,模型却一直不给力。直接扔给SVR(支持向量回归机),训练时间还能接受,但预测结果不…

2026/10/20 20:41:20 阅读更多 →
curl GET与POST请求实战:JSON参数、编码与调试技巧

curl GET与POST请求实战:JSON参数、编码与调试技巧

1. 为什么值得花时间把curl的GET和POST彻底搞明白日常开发里,调试接口这件事几乎每天都在发生。浏览器里点来点去只能覆盖最简单的场景,一旦遇到需要自定义请求头、携带JSON体、模拟特定认证方式的情况,图形化工具就开始捉襟见肘。而curl这个…

2026/10/20 20:41:20 阅读更多 →

最新新闻

手写鼠标点击粒子特效:从原理到性能优化的完整实战

手写鼠标点击粒子特效:从原理到性能优化的完整实战

前阵子给某活动页面做氛围优化,需求方反复强调要有“互动感”。白底、黑字、产品图,排版再干净,鼠标移上去没有任何反馈,也确实容易让人产生“这是个静态PPT”的错觉。于是我想到了“鼠标粒子特效”——准确说,是一段H…

2026/10/20 21:16:52 阅读更多 →
Java实现IP归属地查询:离线库方案与Spring Boot封装实践

Java实现IP归属地查询:离线库方案与Spring Boot封装实践

在做日志分析和用户画像时,后端服务拿到一个公网IP,最朴素的需求就是想知道这个IP到底来自哪个省、哪个市,甚至哪个运营商。这个需求听起来不难,网上搜“Java IP归属地查询”会跳出一堆在线API,复制一段代码就能跑通&a…

2026/10/20 21:16:52 阅读更多 →
基于SpringBoot和微信小程序的考研学习系统开发实战

基于SpringBoot和微信小程序的考研学习系统开发实战

先说结论:这套“基于微信小程序的考研学习系统”,选题方向是对的,技术栈也不冷门。后端SpringBoot、前端微信原生小程序,功能覆盖学习计划、每日打卡、题库刷题、错题本、学习统计和后台管理。作为计算机毕业设计,它兼…

2026/10/20 21:16:52 阅读更多 →
context-mode上下文模式设计:从状态机建模到工程落地的完整实践

context-mode上下文模式设计:从状态机建模到工程落地的完整实践

1. 从“上下文模式”这个命名说起:它到底在解决什么问题第一次看到“context-mode”这个词,很多人会下意识地把它当成某个框架里的配置项,或者某个编辑器插件的开关。但如果你真的在工程一线待过几年,就会发现这个词背后藏着一个非…

2026/10/20 21:16:52 阅读更多 →
STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

STM32F103裸机驱动两相四线步进电机:时序精度与IO翻转控制实战

简介:本资源是一套基于STM32F103微控制器的两相四线步进电机驱动程序,面向嵌入式初学者、电机控制实践者及自动化设备开发工程师,解决步进电机精准启停、方向切换与细分控制等核心问题,适用于3D打印机、CNC小车、精密位移平台等需…

2026/10/20 21:16:52 阅读更多 →
Java+Selenium自动化测试入门:核心机制与工程实践全解析

Java+Selenium自动化测试入门:核心机制与工程实践全解析

1. 项目概述:JavaSelenium到底在解决什么问题说实话,Selenium这个框架我已经用了快十年,从最早的Selenium IDE到现在的WebDriver 4.x,踩过的坑能装满一个仓库。这些年有很多新手问我同一个问题:"JavaSelenium到底…

2026/10/20 21:15:44 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →