推荐一个零声学院免费教程,个人觉得老师讲得不错,
分享给大家:[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,但是找不到,说明地图出问题了,地图存在哪里呢?环境变量。好了,思路出现了,然后具体问题具体分析吧。
- *** Unable to find the ncurses libraries or the
- *** required header files.
- *** 'make menuconfig' requires the ncurses libraries.
- ***
- *** Install ncurses (ncurses-devel) and try again.
- ***
- scripts/kconfig/Makefile:187: recipe for target 'scripts/kconfig/dochecklxdialog' failed
- make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
- Makefile:541: recipe for target 'menuconfig' failed
- make: *** [menuconfig] Error 2
我这里使用的正点原子提供的编译脚本,它的内容如下所示:
- #使用Yocto SDK里的GCC 5.3.0交叉编译器编译出厂Linux源码,可不用指定ARCH等,直接执行Make
- source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
- #!/bin/bash
- #编译前先清除
- #make distclean
- #配置defconfig文件
- #ARCH=arm
- export ARCH=arm
- #make imx_v7_defconfig -j 16
- #开始编译zImage
- make menuconfig
- make zImage -j 16
从脚本内容可知,它首先使用source命令执行了一个environment-setup-cortexa7hf-neon-poky-linux-gnueabi,从这个名字可知,它设置了部分环境变量。
猜测,它设置环境变量的时候,把库给整没了,所以先打开它看看吧。
- export SDKTARGETSYSROOT=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi
- 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
- 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
- export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
- export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
- export CONFIG_SITE=/opt/fsl-imx-x11/4.1.15-2.1.0/site-config-cortexa7hf-neon-poky-linux-gnueabi
- export OECORE_NATIVE_SYSROOT="/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux"
- export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
- export OECORE_ACLOCAL_OPTS="-I /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
- unset command_not_found_handle
- export CC="arm-poky-linux-gnueabi-gcc -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
- export CXX="arm-poky-linux-gnueabi-g++ -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
- export CPP="arm-poky-linux-gnueabi-gcc -E -march=armv7ve -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT"
- export AS="arm-poky-linux-gnueabi-as "
- export LD="arm-poky-linux-gnueabi-ld --sysroot=$SDKTARGETSYSROOT"
- export GDB=arm-poky-linux-gnueabi-gdb
- export STRIP=arm-poky-linux-gnueabi-strip
- export RANLIB=arm-poky-linux-gnueabi-ranlib
- export OBJCOPY=arm-poky-linux-gnueabi-objcopy
- export OBJDUMP=arm-poky-linux-gnueabi-objdump
- export AR=arm-poky-linux-gnueabi-ar
- export NM=arm-poky-linux-gnueabi-nm
- export M4=m4
- export TARGET_PREFIX=arm-poky-linux-gnueabi-
- export CONFIGURE_FLAGS="--target=arm-poky-linux-gnueabi --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
- export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
- export CPPFLAGS=""
- export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
- export OECORE_DISTRO_VERSION="4.1.15-2.1.0"
- export OECORE_SDK_VERSION="4.1.15-2.1.0"
- export ARCH=arm
- export CROSS_COMPILE=arm-poky-linux-gnueabi-
-
- # Append environment subscripts
- if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
- for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
- . $envfile
- done
- fi
- if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
- for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
- . $envfile
- done
- fi
看第二行 export PATH=XXX:$PATH,添加了很多的可执行程序路径,这说明,很多可执行执行都会被该SDK替代。
然后看下面这一行
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig,估计问题就出现这里
在根目录下搜索pkgconfig文件,将搜索到的pkgconfig的绝对路径都包含过来。
sudo find / -name pkgconfig
搜索到下面几个路径
- /usr/local/lib/pkgconfig
- /usr/local/apache2/lib/pkgconfig
- /usr/local/apr/lib/pkgconfig
- /usr/lib/x86_64-linux-gnu/pkgconfig
- /usr/lib/pkgconfig
- /usr/share/pkgconfig
按照我的浅薄的理解,应该能搜索到/lib/pkgconfig,结果并没有。pkgconfig目录中存放的都是.pc文件,找一个.pc文件,看看里面是什么东西。
cd /usr/local/lib/pkgconfig$
ls
- lkmao@ubuntu:/usr/local/lib/pkgconfig$ ls
- libpcrecpp.pc libpcre.pc libpcreposix.pc
- lkmao@ubuntu:/usr/local/lib/pkgconfig$
就看下libpcre.pc吧,如下,prefix是安装路径,libdir是lib文件的路径,includedir是头文件的路径,所以我们可以尝试自己创建一个ncurses.pc文件
- lkmao@ubuntu:/usr/local/lib/pkgconfig$ cat libpcre.pc
- # Package Information for pkg-config
-
- prefix=/usr/local
- exec_prefix=${prefix}
- libdir=${exec_prefix}/lib
- includedir=${prefix}/include
-
- Name: libpcre
- Description: PCRE - Perl compatible regular expressions C library with 8 bit character support
- Version: 8.45
- Libs: -L${libdir} -lpcre
- Libs.private:
- Cflags: -I${includedir}
创建目录/lib/pkgconfig,我的ubuntu原本没有这个目录。
sudo mkdir /lib/pkgconfig -p
cd /lib/pkgconfig/
sudo touch ncurses.pc
在ncurses.pc中写入如下内容:
- # Package Information for pkg-config
-
- prefix=/lib
- exec_prefix=${prefix}
- libdir=${exec_prefix}/x86_64-linux-gnu/
- 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脚本。好了问题解决了。
只是因为在编译脚本中加了一行,去掉就好了。
export ARCH=arm
这编译脚本,脾气还挺大。
你遇到过类似的问题吗,欢迎评论区浏览讨论。