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相关推荐

  1. 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".下面开始查找原因. 第一 ...

  2. 编译linux内核时出错

    在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the *** require ...

  3. Redhat7.2上编译Linux内核源码

    下载linux源码包:https://git.kernel.org/pub/scm/virt/kvm/kvm.git/snapshot/kvm-4.17-1.tar.gz (这是包含kvm开发版本的l ...

  4. 编译linux内核时drivers/mtd/mtdconcat出错,linux 内核编译(七)

    转: linux内核编译 # # IP: Netfilter Configuration # CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_I ...

  5. ubuntu上编译Linux内核步骤

    一.虚拟机的准备 1.下载Ubuntu镜像 Enterprise Open Source and Linux | Ubuntu 在最左边Ubuntu Desktop处点22.04LTS下载iso文件 ...

  6. 编译linux内核适用的编译器,编译Linux内核时,CC,LD和CC [M]输出的代码是什么?...

    所以一般情况下,你只需要 git grep 'cmd.* = CODE' 找到CODE. 获取scripts/Makefile.build定义的所有代码 make | grep -E '^ ' | s ...

  7. Linux内核开发_1_编译LInux内核

    目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...

  8. debian 编译linux内核源码,安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  9. linux内核使用make编译出错,编译Linux内核出现错误:make vexpress_defconfig menuconfig...

    在编译Linux内核时出现错误: wit@ubuntu:/home/linux-5.4.14# make vexpress_defconfig LEX     scripts/kconfig/lexe ...

最新文章

  1. 2021年UI设计培训机构哪个好
  2. ETSI MEC — 与 NFV 的融合
  3. 安卓 通过intent调用系统文件管理器打开指定路径目录
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
  5. Floating-Rate Note - FRN
  6. 配置Ubuntu虚拟环境
  7. php计算单双,PHP中单双号与变量
  8. QT与opencv(二)开启摄像头
  9. PHP的的指针的特性
  10. 成都Uber优步司机奖励政策(3月31日)
  11. 教你怎么样快速降低室内装饰设计污染
  12. 养猫日记之如何获得一只喵
  13. 全国DNS服务器IP地址【电信、网通、铁通】。
  14. 数据库的系统组成包括哪些?
  15. 怎样推断server为虚拟机还是物理真机?
  16. 蛋白质结构数据预处理基础(个人笔记)
  17. 【向生活低头】win10电脑使用录音机的注意事项
  18. java word 图片不显示_POI用addPicture插入图片到word里面无法显示
  19. 黑莓 掌上百度 下载
  20. NLP自然语言处理-英文文本电影影评分类2-pytorch版本

热门文章

  1. 《Armv8/armv9架构入门指南》-【第一章】- 前言
  2. Oracle 技能强化 Part 8 日期操作
  3. 关于工作与生活——HP大中华区总裁孙振耀撰文谈退休并畅谈人生
  4. mac下ElasticSearch 集群搭建,使用Kibana配置和管理集群
  5. TCP/IP五层模型基本协议及相关报文知识
  6. centos解决redis客户端连接不上
  7. 鸡蛋个数计算c语言编程,“数”鸡蛋
  8. Qt 之 设置窗口边框的圆角
  9. 美国警方致命枪击案数据可视化分析 上
  10. 74HC595 8位移位寄存器介绍