Mac上编译Linux内核时找不到ncurses
Mac上编译Linux内核时找不到ncurses
前言
Linux源码零零散散看了一些,东西太多。今天突然有兴趣想去编译一下Linux内核,就去网上找了一些资料,由于我是用的Mac,然后并没有找到好的编译指导。只是找到编译入口,make menuconfig or make kconfig,作者建议采用make menuconfig,一开始不明白,稍后再给大家解答(你懂了的话就算了,反正我一开始不懂)。
先说明一下,我使用的Linux版本是:5.1.5. 我的Mac是10.14.4.
好了,现在开始吧!
开始编译
cd进入Linux根目录,执行make menuconfig 。很不幸,遇到报错:
192:linux-5.1.5 liuqi$ make menuconfig
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
*
* Unable to find the ncurses package.
* Install ncurses (ncurses-devel or libncurses-dev
* depending on your distribution).
*
make[2]: *** [scripts/kconfig/mconf-cfg] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [sub-make] Error 2
错误关键信息是:
- Unable to find the ncurses package.
- Install ncurses (ncurses-devel or libncurses-dev
- depending on your distribution).
好了,大概就是没有找到ncurses,需要安装。那么,ncurses是个啥东西?百度一番之后是这个意思:
首先说下curses(在这里不是咒骂的意思,0.0),curses是一个在Linux/Unix下广泛应用的图形函数库,作用是可以在终端内绘制简单的图形用户界面。ncurses应该是new+curses的意思,进化版curses的意思吧。它的功能主要是增强终端,实现图形化和菜单式效果。大家应该用过vi/vim吧,它就是基于curses开发的。(后面会展示具体效果)
安装ncurses
好了,下面开始安装ncurses吧,用brew命令:
brew install ncurses。
(这个我已经安装完成了,也比较简单,所以就不贴图了,不会的大家可以上网搜索)
开始第二次编译
安装完后,再来编译linux:make menuconfig,结果依然报错,跟上面错误一样。(有点意外0.0)
为什么呢?难道是我安装失败了?但是brew确实告诉我安装成功了。开启终端,输出ncurses回车,很不幸又报错了:
-bash: ncurses: command not found
What?Why?确实没有这个ncurses。见鬼了,有点不爽了。再来:
输入ncur 按tab键自动补全,显示了ncurses5.4-config,有点像ncurses但是不一样,用which命令看下ncurses5.4-config,路径是/usr/bin/ncurses5.4-config,/usr/bin下面也确实没有ncurses。难道是安装失败了?再来,先去卸载ncurses试试:brew uninstall ncurses:
macbook-air:~ liuqi$ brew uninstall ncurses
Uninstalling /usr/local/Cellar/ncurses/6.1... (3,869 files, 8.3MB)
卸载成功了,说明之前应该是安装成功了,能看到安装路径。为了确认,再安装一次,然后再去编译linux,还是一样报错了!!!(都一样,不再具体描述了)
为啥还是不行呢?怎么这样坑呢?没办法,只能使用绝招了,看看你里面是咋玩的。
看源码分析问题
按理说安装上ncurses就可以了(以前类似的问题这样就可以解决了),竟然不行。既然有报错信息,那就去linux文件中搜索一下,我用的VScode,还是很方便的。果然,找到了:
但是有2处,简单起见,直接去改代码,加点特殊标记,再次编译linux,根据输出日志确认是:mconf-cfg.sh,好了下面来看看这个文件吧,代码不多,我就直接贴上:
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0PKG="ncursesw"
PKG2="ncurses"if [ -n "$(command -v pkg-config)" ]; thenif pkg-config --exists $PKG; thenecho cflags=\"$(pkg-config --cflags $PKG)\"echo libs=\"$(pkg-config --libs $PKG)\"exit 0fiif pkg-config --exists $PKG2; thenecho cflags=\"$(pkg-config --cflags $PKG2)\"echo libs=\"$(pkg-config --libs $PKG2)\"exit 0fi
fi# Check the default paths in case pkg-config is not installed.
# (Even if it is installed, some distributions such as openSUSE cannot
# find ncurses by pkg-config.)
if [ -f /usr/include/ncursesw/ncurses.h ]; thenecho cflags=\"-D_GNU_SOURCE -I/usr/include/ncursesw\"echo libs=\"-lncursesw\"exit 0
fiif [ -f /usr/include/ncurses/ncurses.h ]; thenecho cflags=\"-D_GNU_SOURCE -I/usr/include/ncurses\"echo libs=\"-lncurses\"exit 0
fiif [ -f /usr/include/ncurses.h ]; thenecho cflags=\"-D_GNU_SOURCE\"echo libs=\"-lncurses\"exit 0
fiecho >&2 "*"
echo >&2 "* Unable to find the ncurses package."
echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev"
echo >&2 "* depending on your distribution)."
echo >&2 "*"
exit 1
我一开始关注得是路径相关的,因为我安装了ncurses但是找不到的话那就是路径问题了,果然,路径跟我的不一样:
/usr/include/xxx等,我的Mac上根本就没有!!!我去打开我的Ubuntu虚拟机系统看了,Ubuntu是有/usr/include的,所以应该是系统差异。网上大多好像是在linux上编译linux,谁让我在Mac上编译呢0.0。没关系,反正都差不多。
我怀疑是我安装ncurses有问题,准备自行下载压缩包,自己安装。后来一想应该不是这个原因,毕竟我业安装过其他软件,都没有/usr/include这个目录,这个思路pass。
另外有网上说可以建立软连接,我觉得可行,就是尝试,结果创建/usr/include失败,没有权限,chmod修改权限再尝试依然失败,据说是Mac系统限制,rootless,反正就是不行,这条路也走不通。
没办法了,只能迫不得已去改linux的编译脚本了(我个人不建议这么搞,毕竟官方的东西还是比较靠谱的,但是特殊情况下可以不择手段试试,别怂),于是我就根据我Mac上ncurses安装路径,改写mconf-cfg.sh,将那几个路径改成我的,编译时又报错ncurses的一些头文件找不到之类的,具体不讲了,路已走偏,这都不是重点。
搞了好久还是一筹莫展,后来又仔细研究了下mconf-cfg.sh,注意到这样几行代码:
PKG="ncursesw"
PKG2="ncurses"if [ -n "$(command -v pkg-config)" ]; thenif pkg-config --exists $PKG; thenecho cflags=\"$(pkg-config --cflags $PKG)\"echo libs=\"$(pkg-config --libs $PKG)\"exit 0fiif pkg-config --exists $PKG2; thenecho cflags=\"$(pkg-config --cflags $PKG2)\"echo libs=\"$(pkg-config --libs $PKG2)\"exit 0fi
fi
有一个pkg-config ,看了下大概理解是:如果pkg-config 判断安装了ncurses了也就不会执行下面的按照头文件路径去找了。瞬间又觉得发现了新大陆。赶紧再去百度一番,研究下pkg-config又是个啥东西。
关于pkg-config
这个只是点简单,不是啥重点内容,也没啥难度,就直接说了,简单说来pkg-config就是更方便的反馈你所使用的第三方库的依赖信息,比如头文件啊、库啊什么的,你需要安装pkg-config工具,使用此命令。那么,pkg-config又是咋知道第三方库有那些依赖的呢?其实是从xx.pc文件里读取的,比如下面是我给我的ncurse库写的ncurses.pc:
Name: ncurses
Description: ncurses library
Url: https://invisible-island.net/ncurses/announce.html
Version: 6.1
Requires:
Requires.private:
Cflags: -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.Internal.sdk/usr/local/include
Libs: -L/usr/local/Cellar/ncurses/6.1/lib -lncurses
好了,大概明白了,可为啥我安装了ncurses了,怎么pkg-config还是没有找到ncurses信息呢?我单独去跑这个命令试试,结果报错:
Package dd was not found in the pkg-config search path.
Perhaps you should add the directory containing `ncurse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'ncurse' found
原因是我的电脑上并没有生成ncurses.pc文件(我也去查找了资料怎样自动生成pc文件,没有找到),于是就自己写了一个ncurses.pc,就是上面的那个。可是我写好了之后怎么能让pkg-config找到我这个ncurses.pc呢?好像需要去配置环境变量PKG_CONFIG_PATH,那好吧,vim ~/.bash_profile 增加配置:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig:/Users/liuqi/pkgconfig
export PKG_CONFIG_PATH
/usr/lib/pkgconfig是默认的pkg-config搜索目录,但是由于rootless问题,我没办法把我的ncurses.pc丢进去,只能另外搞一个目录/Users/liuqi/pkgconfig存放我的ncurses.pc。
Mac终端shell脚本运行,走你:
macbook-air:~ liuqi$ pkg-config --cflags ncurses
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.Internal.sdk/usr/local/include
能识别到了,说明pkg-config找ncurses没问题了。
好了,转战VScode,心里美滋滋的,迫不及待在终端运行make menuconfig,还是失败!!!
为啥呢?在VSCode里pkg-config就找不到ncurses呢?仔细一想,应该是环境变量PKG_CONFIG_PATH问题,可能是编译linux时的shell进程并PKG_CONFIG_PATH并没有起效,于是将PKG_CONFIG_PATH的配置代码拷贝过来,放进mconf-cfg.sh:
# PKG_CONFIG_PATH
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig:/Users/liuqi/pkgconfig
export PKG_CONFIG_PATHPKG="ncursesw"
PKG2="ncurses"if [ -n "$(command -v pkg-config)" ]; thenif pkg-config --exists $PKG; thenecho cflags=\"$(pkg-config --cflags $PKG)\"echo libs=\"$(pkg-config --libs $PKG)\"exit 0fiif pkg-config --exists $PKG2; thenecho cflags=\"$(pkg-config --cflags $PKG2)\"echo libs=\"$(pkg-config --libs $PKG2)\"exit 0fi
fi
谨慎地在终端运行make menuconfig,又失败了,不过这次不是pkg-config问题了,而是这样的:
#
# using defaults found in arch/x86/configs/x86_64_defconfig
#
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[2]: *** [menuconfig] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [sub-make] Error 2
乍一看没明白啥意思,仔细琢磨了下,应该是说我的终端窗口太小了,于是尝试拉大,行列足够,再次运行make menuconfig,终于成功了!!!
看到了没有?是不是感觉跟安装windows系统时的BOOT配置类似?这就是所谓的终端图形化和菜单式效果。
后来在mconf-cfg.sh去掉PKG_CONFIG_PATH再去编译也行,可能是一开始在环境变量配置后VScode没有立即生效。将mconf-cfg.sh全部恢复回去。(尽量不要改动官方原有的东西,否则出问题自己都很难找)
关键是Mac上安装ncurses跟linux不一样,路径对不上、也没有生成ncurses.pc,果然高兴太早不好,坑总是意想不到的。
好了,休息休息,搞了半天,缓缓,晚上又忘记吃饭了0.0。
Mac上编译Linux内核时找不到ncurses相关推荐
- Linux 编译时查找错误字符,编译Linux内核时出现“fatal error: linux/netfilter/xt_dscp: No such file or directory”...
编译Linux内核时出现"fatal error: linux/netfilter/xt_dscp: No such file or directory".下面开始查找原因. 第一 ...
- 编译linux内核时出错
在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the *** require ...
- Redhat7.2上编译Linux内核源码
下载linux源码包:https://git.kernel.org/pub/scm/virt/kvm/kvm.git/snapshot/kvm-4.17-1.tar.gz (这是包含kvm开发版本的l ...
- 编译linux内核时drivers/mtd/mtdconcat出错,linux 内核编译(七)
转: linux内核编译 # # IP: Netfilter Configuration # CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_I ...
- ubuntu上编译Linux内核步骤
一.虚拟机的准备 1.下载Ubuntu镜像 Enterprise Open Source and Linux | Ubuntu 在最左边Ubuntu Desktop处点22.04LTS下载iso文件 ...
- 编译linux内核适用的编译器,编译Linux内核时,CC,LD和CC [M]输出的代码是什么?...
所以一般情况下,你只需要 git grep 'cmd.* = CODE' 找到CODE. 获取scripts/Makefile.build定义的所有代码 make | grep -E '^ ' | s ...
- Linux内核开发_1_编译LInux内核
目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...
- debian 编译linux内核源码,安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- linux内核使用make编译出错,编译Linux内核出现错误:make vexpress_defconfig menuconfig...
在编译Linux内核时出现错误: wit@ubuntu:/home/linux-5.4.14# make vexpress_defconfig LEX scripts/kconfig/lexe ...
最新文章
- 2021年UI设计培训机构哪个好
- ETSI MEC — 与 NFV 的融合
- 安卓 通过intent调用系统文件管理器打开指定路径目录
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
- Floating-Rate Note - FRN
- 配置Ubuntu虚拟环境
- php计算单双,PHP中单双号与变量
- QT与opencv(二)开启摄像头
- PHP的的指针的特性
- 成都Uber优步司机奖励政策(3月31日)
- 教你怎么样快速降低室内装饰设计污染
- 养猫日记之如何获得一只喵
- 全国DNS服务器IP地址【电信、网通、铁通】。
- 数据库的系统组成包括哪些?
- 怎样推断server为虚拟机还是物理真机?
- 蛋白质结构数据预处理基础(个人笔记)
- 【向生活低头】win10电脑使用录音机的注意事项
- java word 图片不显示_POI用addPicture插入图片到word里面无法显示
- 黑莓 掌上百度 下载
- NLP自然语言处理-英文文本电影影评分类2-pytorch版本