技术知识库

BusyBox 1.37 menuconfig 在 GCC 15 下误报缺少 ncurses

BusyBox 1.37 menuconfig 在 GCC 15 下误报缺少 ncurses

摘要

BusyBox 1.37.0 在 Ubuntu 26.04 上运行 make menuconfig 时误报缺少 ncurses,但 libncurses-dev、头文件、pkg-config 和链接库均已存在。真正原因是 check-lxdialog.sh 的编译探针使用没有返回类型的 main() {};GCC 15 将隐式 int 当作错误,而脚本丢弃编译器 stderr 后统一报告为 ncurses 缺失。

目标

为 ARM64 静态 BusyBox 打开 menuconfig,启用 CONFIG_STATIC=y。

实际现象

*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.

Ubuntu 上的正确开发包实际已经安装:

libncurses-dev 6.6+20251231-1
pkg-config ncurses: 6.6.20251231
link flags: -lncurses -ltinfo

/usr/include/ncurses.h 和 /usr/include/ncursesw/ncurses.h 也均存在。错误消息建议的 ncurses-devel 是 Fedora/RHEL 包名,不适用于 Ubuntu。

原因定位

make V=1 menuconfig 显示失败来自:

scripts/kconfig/lxdialog/check-lxdialog.sh -check gcc ... -lncursesw -ltinfo

该脚本用于检测 ncurses 的源码片段为:

#include CURSES_LOC
main() {}

脚本把 GCC 的 stderr 重定向到 /dev/null,使真实原因不可见。手动运行等价的最小编译测试得到:

error: return type defaults to ‘int’ [-Wimplicit-int]

退出码为 1。因此失败发生在过时的 C 语法,而不是头文件或链接库。

修复

将 scripts/kconfig/lxdialog/check-lxdialog.sh 中的测试入口改为标准 C 定义:

int main(void) { return 0; }

修复后重新运行 make menuconfig。

验证

将探针改为标准 C 的 int main(void) { return 0; } 后,menuconfig 成功构建并打开。进入 Settings 启用静态链接、保存配置后,验证得到:

CONFIG_STATIC=y

故障已修复并完成实际验证。

关联