• ncurses库意外失联引发的思考


    推荐一个零声学院免费教程,个人觉得老师讲得不错,
    分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
    fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
    TCP/IP,协程,DPDK等技术内容,点击立即学习:

    https://ke.qq.com/course/4032547?flowToken=1042705

    前言

    安装ncurses库其实很简单

    sudo apt-get install libncurses5-dev

    安装完毕后,库文件存在一下目录中。

    /lib/x86_64-linux-gnu/libncurses.so.5.9
    /lib/x86_64-linux-gnu/libncursesw.so.5.9
    /lib/x86_64-linux-gnu/libncurses.so.5
    /lib/x86_64-linux-gnu/libncursesw.so.5

             但是还是有意外发生,即便是安装了,也找不到ncurses。粗浅的分析一下,这就好比,你拿地图去游乐园,地图上有什么,你就能找到什么,地图上没有的,可能就找不到。

            ubuntu里有ncurses,但是找不到,说明地图出问题了,地图存在哪里呢?环境变量。好了,思路出现了,然后具体问题具体分析吧。

    一 问题具体描述

    1. *** Unable to find the ncurses libraries or the
    2. *** required header files.
    3. *** 'make menuconfig' requires the ncurses libraries.
    4. ***
    5. *** Install ncurses (ncurses-devel) and try again.
    6. ***
    7. scripts/kconfig/Makefile:187: recipe for target 'scripts/kconfig/dochecklxdialog' failed
    8. make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
    9. Makefile:541: recipe for target 'menuconfig' failed
    10. make: *** [menuconfig] Error 2

    二 问题分析

    我这里使用的正点原子提供的编译脚本,它的内容如下所示:

    1. #使用Yocto SDK里的GCC 5.3.0交叉编译器编译出厂Linux源码,可不用指定ARCH等,直接执行Make
    2. source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
    3. #!/bin/bash
    4. #编译前先清除
    5. #make distclean
    6. #配置defconfig文件
    7. #ARCH=arm
    8. export ARCH=arm
    9. #make imx_v7_defconfig -j 16
    10. #开始编译zImage
    11. make menuconfig
    12. make zImage -j 16

            从脚本内容可知,它首先使用source命令执行了一个environment-setup-cortexa7hf-neon-poky-linux-gnueabi,从这个名字可知,它设置了部分环境变量。

            猜测,它设置环境变量的时候,把库给整没了,所以先打开它看看吧。

    1. export SDKTARGETSYSROOT=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi
    2. export PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/sbin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/sbin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-uclibc:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-musl:$PATH
    3. export CCACHE_PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-uclibc:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-musl:$CCACHE_PATH
    4. export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
    5. export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
    6. export CONFIG_SITE=/opt/fsl-imx-x11/4.1.15-2.1.0/site-config-cortexa7hf-neon-poky-linux-gnueabi
    7. export OECORE_NATIVE_SYSROOT="/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux"
    8. export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
    9. export OECORE_ACLOCAL_OPTS="-I /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
    10. unset command_not_found_handle
    11. export CC="arm-poky-linux-gnueabi-gcc -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
    12. export CXX="arm-poky-linux-gnueabi-g++ -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
    13. export CPP="arm-poky-linux-gnueabi-gcc -E -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
    14. export AS="arm-poky-linux-gnueabi-as "
    15. export LD="arm-poky-linux-gnueabi-ld --sysroot=$SDKTARGETSYSROOT"
    16. export GDB=arm-poky-linux-gnueabi-gdb
    17. export STRIP=arm-poky-linux-gnueabi-strip
    18. export RANLIB=arm-poky-linux-gnueabi-ranlib
    19. export OBJCOPY=arm-poky-linux-gnueabi-objcopy
    20. export OBJDUMP=arm-poky-linux-gnueabi-objdump
    21. export AR=arm-poky-linux-gnueabi-ar
    22. export NM=arm-poky-linux-gnueabi-nm
    23. export M4=m4
    24. export TARGET_PREFIX=arm-poky-linux-gnueabi-
    25. export CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
    26. export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
    27. export CPPFLAGS=""
    28. export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
    29. export OECORE_DISTRO_VERSION="4.1.15-2.1.0"
    30. export OECORE_SDK_VERSION="4.1.15-2.1.0"
    31. export ARCH=arm
    32. export CROSS_COMPILE=arm-poky-linux-gnueabi-
    33. # Append environment subscripts
    34. if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
    35. for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
    36. . $envfile
    37. done
    38. fi
    39. if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
    40. for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
    41. . $envfile
    42. done
    43. fi

    看第二行 export PATH=XXX:$PATH,添加了很多的可执行程序路径,这说明,很多可执行执行都会被该SDK替代。

    然后看下面这一行

    export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig,估计问题就出现这里

    在根目录下搜索pkgconfig文件,将搜索到的pkgconfig的绝对路径都包含过来。

    sudo find / -name pkgconfig
    

    搜索到下面几个路径

    1. /usr/local/lib/pkgconfig
    2. /usr/local/apache2/lib/pkgconfig
    3. /usr/local/apr/lib/pkgconfig
    4. /usr/lib/x86_64-linux-gnu/pkgconfig
    5. /usr/lib/pkgconfig
    6. /usr/share/pkgconfig

    按照我的浅薄的理解,应该能搜索到/lib/pkgconfig,结果并没有。pkgconfig目录中存放的都是.pc文件,找一个.pc文件,看看里面是什么东西。

    cd /usr/local/lib/pkgconfig$
    ls
    1. lkmao@ubuntu:/usr/local/lib/pkgconfig$ ls
    2. libpcrecpp.pc libpcre.pc libpcreposix.pc
    3. lkmao@ubuntu:/usr/local/lib/pkgconfig$

    就看下libpcre.pc吧,如下,prefix是安装路径,libdir是lib文件的路径,includedir是头文件的路径,所以我们可以尝试自己创建一个ncurses.pc文件

    1. lkmao@ubuntu:/usr/local/lib/pkgconfig$ cat libpcre.pc
    2. # Package Information for pkg-config
    3. prefix=/usr/local
    4. exec_prefix=${prefix}
    5. libdir=${exec_prefix}/lib
    6. includedir=${prefix}/include
    7. Name: libpcre
    8. Description: PCRE - Perl compatible regular expressions C library with 8 bit character support
    9. Version: 8.45
    10. Libs: -L${libdir} -lpcre
    11. Libs.private:
    12. Cflags: -I${includedir}

    三 探索解决问题

    创建目录/lib/pkgconfig,我的ubuntu原本没有这个目录。

    sudo mkdir /lib/pkgconfig -p
    cd /lib/pkgconfig/
    sudo touch ncurses.pc
    

    在ncurses.pc中写入如下内容:

    1. # Package Information for pkg-config
    2. prefix=/lib
    3. exec_prefix=${prefix}
    4. libdir=${exec_prefix}/x86_64-linux-gnu/
    5. includedir=${prefix}/include

    修改脚本

    sudo vi /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

    主要是修改下面这一行

    export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig

    修改后的内容如下所示:

    export PKG_CONFIG_PATH=$SDKTARGETSYSROOT:/lib/pkgconfig

    或者在source /xxx/environment-setup-cortexa7hf-neon-poky-linux-gnueabi,添加如下内容

    export PKG_CONFIG_PATH=$SDKTARGETSYSROOT:/lib/pkgconfig

    再次执行build.sh脚本。好了问题解决了。

    四 没有make disclean,为什么还在全部编译

    只是因为在编译脚本中加了一行,去掉就好了。

    export ARCH=arm

    这编译脚本,脾气还挺大。

    总结

            你遇到过类似的问题吗,欢迎评论区浏览讨论。

  • 相关阅读:
    Docker 使用
    Taro小程序隐私协议开发指南填坑
    支付牌照缩量,分账管理系统成为了众多电商平台寻求合规的主要途径
    Spring 事务原理总结七
    代理IP与Socks5代理的技术奇妙之旅
    微信小程序
    【C语言】十六进制转换为十进制
    背包问题(01背包,完全背包,多重背包,用二进制优化的多重背包,分组背包)
    【OpenCV DNN】Flask 视频监控目标检测教程 08
    [Swift]国际化
  • 原文地址:https://blog.csdn.net/yueni_zhao/article/details/126929672