修复mac 下 make menuconfig 的bug以及自定义make menuconfig界面

本文介绍了如何解决在Mac系统下使用`make menuconfig`时遇到的'ld: symbol(s) not found for architecture x86_64'错误,以及如何自定义`make menuconfig`的图形界面。解决方法涉及到修改`check-lxdialog.sh`脚本,添加对库文件路径的检查。同时,文章提供了一个简单的config文件示例,用于创建定制化的配置界面。

韩大卫@吉林师范大学

    2014.12.8 


转载请表明出处

*****************************************

本文目的:

一, 解决在mac 系统里make menuconfig 报错:  lcd: symbol(s) not found for architecture x86_64 的bug

二,  使用mconf, 自定义实现一个make menuconfig的界面


一, 在MAC 系统下使用make menuconfig 调用图形界面做config时,  可能会有如下报错:

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)



一般地, 编译busybox或者uboot或者linux内核等软件包之前,  还是使用图形界面来做配置最为最直观.  实现这一目的自然是执行make menuconfig. 

make menuconfig 实际上就是拿 mconf 这个工具去解析config文件里的描述信息, 进而转换为图形界面, 当然, config 文件有自动定义的语法格式, 详细见本文最下放. 


第一次执行make menuconfig时, 需要先生成 mconf 这个工具, 在预编译 scripts/kconfig/mconf.c 生成scripts/kconfig/mconf.o 之后的连接阶段,   

需要ldconfig参数给出所需要连接的库的位置,  所说的库为后缀为.a 或.so 或 .dylib 的ncursesw ncurses curses库, 

生成ldflags的的脚本为: scripts/kconfig/lxdialog/check-lxdialog.sh


上面报错的原因就是,   MAC 系统下  ncursesw ncurses curses 这些库文件的位置不能通过 check-lxdialog.sh 里给出命令来找到, 所以生成的 ldflags 不对, 进而无法生成mconf. 


该bug的解决办法如下:

以编译 busybox 为例子:


打开 scripts/kconfig/lxdialog/check-lxdialog.sh  文件. 

vi scripts/kconfig/lxdialog/check-lxdialog.sh


将红色部分添加进去即可. 

ldflags()         

{     &

<think>在OpenWrt构建系统中,`make kernel_menuconfig`和`make menuconfig`是两个不同的配置,它们分别用于配置不同的部分。出现`make kernel_menuconfig`卡住而`make menuconfig`正常运行的情况,可能有以下几个原因: 1. **配置不同**: - `make menuconfig`:用于配置OpenWrt的用户空间软件包、平台、构建选项等。 - `make kernel_menuconfig`:用于配置Linux内核的选项。它需要进入内核的配置界面。 2. **环境依赖问题**: - `kernel_menuconfig`需要内核的配置工具,并且可能依赖于特定的环境。例如,它可能需要正确的工具链(toolchain)已经编译完成,或者需要一些特定的库(如ncurses)来支持文本界面。 3. **构建系统状态**: - 如果之前有成功编译过内核,或者内核源码还有准备好,执行`make kernel_menuconfig`可能会卡住。因为OpenWrt在配置内核前可能需要先准备内核源码树,而这个过程可能因为网络问题(如下载失败)或构建问题而卡住。 4. **终端兼容性问题**: - 虽然两者都使用基于ncurses的文本界面,但`kernel_menuconfig`使用的是Linux内核的配置界面(由内核的scripts/kconfig/mconf实现),而`menuconfig`使用的是OpenWrt的配置界面(由buildroot的配置工具实现)。有可能终端对这两个程序的兼容性不同,导致其中一个卡住。 5. **并发构建问题**: - 如果之前有构建过程被中断,或者存在多个构建进程同时运行,可能会导致资源竞争或锁文件残留,从而卡住。 6. **特定版本Bug**: - 某些OpenWrt版本可能存在特定bug,导致`kernel_menuconfig`执行时卡住。 ### 解决方法 1. **确保环境准备就绪**: - 在运行`make kernel_menuconfig`之前,先执行`make tools/install`和`make toolchain/install`,确保工具链和工具已经安装。 2. **清理之前的构建**: - 尝试执行`make clean`或`make dirclean`(注意:这会清除之前的构建结果,包括下载的源码和编译的文件)。然后重新尝试`make kernel_menuconfig`。 3. **检查网络连接**: - 因为OpenWrt在构建过程中可能会下载内核源码或补丁,如果网络连接有问题,可能会卡在下载步骤。确保网络正常,或者预先下载好所需的源码包。 4. **检查终端设置**: - 尝试使用不同的终端模拟器(如xterm, gnome-terminal等)或者使用简单的终端(如linux console)来执行命令,以排除终端兼容性问题。 5. **手动进入内核配置**: - 如果上述方法无效,可以尝试手动进入内核配置: ```bash # 进入内核源码录(具体路径根据平台不同而不同,例如) cd build_dir/target-<arch>/linux-<platform>/linux-<version> make menuconfig ``` 配置完成后,将生成的`.config`文件复回OpenWrt的`target/linux/<platform>/`录下(根据平台不同,可能需要覆盖特定的配置文件)。 6. **查看日志**: - 在运行`make kernel_menuconfig`时,可以查看OpenWrt的构建日志(通常是`logs/`录下的文件)来定位卡住的位置。 7. **升级或修复OpenWrt**: - 如果问题是由于特定版本的bug引起的,尝试更新到最新版本的OpenWrt,或者查找相关的补丁。 ### 示例步骤(手动进入内核配置) 假设你的OpenWrt录在`~/openwrt`,平台是`x86/64`,内核版本是`5.10`,那么可以按照以下步骤手动配置内核: 1. 进入内核源码录: ```bash cd ~/openwrt/build_dir/target-x86_64_musl/linux-x86_64/linux-5.10.123 ``` 注意:实际录名可能因版本和平台不同而不同。 2. 运行内核的配置命令: ```bash make menuconfig ``` 3. 配置完成后,保存并退出。此时会在当前录生成一个`.config`文件。 4. 将生成的配置文件复到OpenWrt的配置录: ```bash cp .config ~/openwrt/target/linux/x86/64/config-5.10 ``` 注意:配置文件名和路径可能因平台和版本而异。需要根据实际情况选择正确的配置文件。 5. 回到OpenWrt根录,继续构建。 ### 结论 `make kernel_menuconfig`卡住而`make menuconfig`正常运行,主要是因为两者配置的不同,且`kernel_menuconfig`需要的内核配置环境可能有正确准备。通过手动进入内核配置或者确保构建环境准备充分,可以解决这个问题。 §§相关问题§§: 1. OpenWrt构建系统中的`make menuconfig`和`make kernel_menuconfig`分别配置什么内容? 2. 在OpenWrt中,如何为特定平台的内核打补丁? 3. 在OpenWrt构建过程中,如何预先下载所有需要的软件包源码? 4. 如何将自定义的内核配置文件添加到OpenWrt的构建系统中?</think>### 为什么在 OpenWrt 录下 `make kernel_menuconfig` 卡住而 `make menuconfig` 正常运行? #### 根本原因分析: 在 OpenWrt 构建系统中,`make kernel_menuconfig` 和 `make menuconfig` 是两个完全不同的配置,它们的工流程和依赖关系存在关键差异: | 配置 | 用范围 | 依赖关系 | 界面实现 | 常见卡住原因 | |-------------------|----------------------|--------------------------|------------------|-------------| | `make menuconfig` | OpenWrt 用户空间配置 | 仅需基本构建工具 | OpenWrt 自实现 | 较少卡住 | | `make kernel_menuconfig` | Linux 内核配置 | 需完整内核构建环境 | Linux kconfig 系统 | 易卡住 | #### 具体卡住原因及解决方案: **1. 内核源码未准备就绪 (最常见原因)** ```bash # 典型错误表现:卡在下载或解压阶段 Checking 'working-make'... ok. Checking 'case-sensitive-fs'... ok. Checking 'proper-uml'... ok. Downloading https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.123.tar.xz # 长时间无响应 ``` **解决方法:** ```bash # 手动准备内核源码 make target/linux/prepare V=s # 或强重新准备 make target/linux/clean make target/linux/prepare ``` **2. 内核配置工具编译失败** ```bash # 错误日志位置 openwrt/build_dir/target-*/linux-*/linux-*/scripts/kconfig/.mconf.o.cmd ``` **解决方法:** ```c // 检查 mconf 工具编译状态 #include <stdio.h> #include <ncurses.h> // 关键依赖库 int main() { if (!initscr()) { printf("ERROR: Ncurses initialization failed!\n"); return 1; } printw("Ncurses works!"); refresh(); getch(); endwin(); return 0; } ``` 编译测试:`gcc test_ncurses.c -lncurses -o test` **3. 终端兼容性问题** ```bash # 设置 TERM 环境变量 export TERM=xterm-256color # 尝试简单 ncurses 程序 sudo apt install ninvaders ninvaders # 测试终端图形能力 ``` **4. 文件权限问题** ```bash # 检查内核构建录权限 ls -ld openwrt/build_dir/target-*/linux-* # 修复权限 sudo chown -R $USER:$USER openwrt ``` **5. 资源不足** ```c // 监控资源使用 #include <stdio.h> #include <sys/resource.h> int main() { struct rusage usage; getrusage(RUSAGE_SELF, &usage); printf("Memory: %ldKB\n", usage.ru_maxrss); return 0; } ``` 运行监控:`while true; do ps aux | grep [m]conf; sleep 1; done` #### 完整诊断流程: ```mermaid graph TD A[执行 make kernel_menuconfig] --> B{是否卡住?} B -->|是| C[检查终端类型] C --> D[验证 ncurses 安装] D --> E[检查内核源码状态] E --> F[查看构建日志] F --> G{找到具体卡点} G --> H[针对性修复] H --> I[重试命令] B -->|否| J[正常配置] ``` #### 替代配置方案: 如果 `kernel_menuconfig` 持续卡住,可直接操内核配置: ```bash # 手动进入内核配置 cd build_dir/target-<arch>/linux-<platform>/linux-<version> make menuconfig # 完成后复配置 cp .config ../../../../target/linux/<platform>/config-<version> ``` #### 永久修复建议: 1. 更新 OpenWrt 到最新版本 2. 确保完整安装依赖: ```bash sudo apt install build-essential libncurses5-dev git gawk flex bison ``` 3. 设置构建环境: ```bash echo "CONFIG_WERROR=n" >> .config make tools/install make toolchain/install ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值