技术知识库
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
故障已修复并完成实际验证。