您的位置:首页 > 编程语言 > Python开发

解决Python交叉编译后,键盘方向键乱码的问题

2017-03-24 16:32 435 查看

参考

http://www.alliedjeep.com/38071.htm

https://www.zhihu.com/question/21518507

http://professor.blog.51cto.com/996189/1618390/

概述

前面几篇博文介绍了Python交叉编译到ARM开发板上面,在使用的时候遇到一个问题,就是当按下键盘上面的方向键的时候看到的都是乱码。

平台

主机: ubuntu14.04 64bit

开发板: qemu + aarch64 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html

工具链: aarch64-linux-gnu-gcc (gcc version 4.9.1 20140529) 用于编译aarch64上面运行的程序

Python版本: Python-3.6.0Python-2.7.13

解决

1、下载readline和termcap的源码

readline的下载链接:

http://files.cnblogs.com/files/pengdonglin137/readline-7.0.tar.gz

或者 http://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz

termcap的下载链接:

http://files.cnblogs.com/files/pengdonglin137/termcap-1.3.1.tar.gz

或者 http://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz

2、交叉编译

readline

解压:

tar -xf readline-7.0.tar.gz
mkdir aarch64
cd aarch64


配置、编译和安装 mk.sh:

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

../readline-7.0/configure --host=aarch64-linux-gnu \
--prefix=`pwd`

make -j4
make install


termcap

termcap编译稍微麻烦一点,需要手动修改configure生成的Makefile文件。

解压:

tar -xf termcap-1.3.1.tar.gz
mkdir aarch64
cd aarch64


配置 mk1_conf.sh:

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

../termcap-1.3.1/configure --host=aarch64-linux-gnu \
--prefix=`pwd`


修改Makefile


--- Makefile.orgin    2017-03-24 15:50:24.557379472 +0800
+++ Makefile    2017-03-24 15:50:32.749379210 +0800
@@ -21,9 +21,11 @@
srcdir = ../termcap-1.3.1
VPATH = ../termcap-1.3.1

-CC = gcc
-AR = ar
-RANLIB = ranlib
+cross_compile = aarch64-linux-gnu-
+
+CC = ${cross_compile}gcc
+AR = ${cross_compile}ar
+RANLIB = ${cross_compile}ranlib

INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644


即需要手动将修改工具链。

编译安装 mk2_make.sh:

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

make -j4
make install


3、配置Python3

修改mk1_conf.sh, 增加readline和termcap的lib和include路径

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

../Python-3.6.0/configure \
--host=aarch64-linux-gnu \
--build=aarch64 \
--prefix=`pwd` \
--enable-ipv6 \
--enable-shared \
ac_cv_file__dev_ptmx="yes" \
ac_cv_file__dev_ptc="no" \
LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib \
-L/home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch64/lib \
-L/home/pengdonglin/src/qemu/python_cross_compile/Termcap/aarch64/lib" \
CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include \
-I/home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch64/include \
-I/home/pengdonglin/src/qemu/python_cross_compile/Termcap/aarch64/include"


修改完成之后,执行mk1_conf.sh

修改该Module/Setup文件

--- Setup.origin    2017-03-24 15:54:52.609370903 +0800
+++ Setup    2017-03-24 15:09:46.781457397 +0800
@@ -164,7 +164,7 @@
# it, depending on your system -- see the GNU readline instructions.
# It's okay for this to be a shared library, too.

-#readline readline.c -lreadline -ltermcap
+readline readline.c -lreadline -ltermcap

# Modules that should always be present (non UNIX dependent)


即将readline这一行取消注释

编译安装 mk2_make.sh

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

make -j4
make install


4、配置Python2

Python2跟Python3的处理方法稍有不同。

修改mk1_conf.sh, 增加readline和termcap的lib和include路径

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH

../Python-2.7.13/configure --prefix=`pwd` \
--host=arm-none-linux-gnueabi \
--build=x86_64-linux-gnu \
--enable-ipv6 \
--enable-shared \
ac_cv_file__dev_ptmx="yes" \
ac_cv_file__dev_ptc="no" \
LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib \
-L/home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch32/lib \
-L/home/pengdonglin/src/qemu/python_cross_compile/Termcap/aarch32/lib" \
CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include \
-I/home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch32/include \
-I/home/pengdonglin/src/qemu/python_cross_compile/Termcap/aarch32/include" \
LDLAST="-L/home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch32/lib \
-L/home/pengdonglin/src/qemu/python_cross_compile/Termcap/aarch32/lib"


跟Python3一样,添加readline和termcap的include和lib路径, 此外,还需要手动修改LDLAST的值,将readline和termcap的lib的路径添加到其中,否则在编译的时候会提示找不到l-lreadline和-ltermcap,然后执行./mk1_conf.sh

修改Modules/Setup

--- Setup.orig    2017-03-24 16:44:37.121275501 +0800
+++ Setup    2017-03-24 15:18:11.845441252 +0800
@@ -163,7 +163,7 @@
# it, depending on your system -- see the GNU readline instructions.
# It's okay for this to be a shared library, too.

-#readline readline.c -lreadline -ltermcap
+readline readline.c -lreadline -ltermcap

# Modules that should always be present (non UNIX dependent):


编译 mk2_make.sh

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

make HOSTPYTHON=../x86_64/python \
HOSTPGEN=../x86_64/Parser/pgen \
BLDSHARED="aarch64-linux-gnu-gcc -shared" \
CROSS_COMPILE=aarch64-linux-gnu- \
CROSS_COMPILE_TARGET=yes \
HOSTARCH=aarch64-linux-gnu \
BUILDARCH=x86_64-linux-gnu \
-j4


安装 mk3_install.sh

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

make install HOSTPYTHON=../x86_64/python \
BLDSHARED="aarch64-linux-gnu-gcc -shared" \
CROSS_COMPILE=arm-none-linux-gnueabi- \
CROSS_COMPILE_TARGET=yes \
prefix=`pwd`


5、修改制作ramdisk的脚本 mk_ramdisk.sh

#!/bin/bash

export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH

sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -rf ramdisk*

sudo mkdir rootfs
sudo cp ../busybox-1.24.2/_install/*  rootfs/ -raf

sudo mkdir -p rootfs/proc/
sudo mkdir -p rootfs/sys/
sudo mkdir -p rootfs/tmp/
sudo mkdir -p rootfs/root/
sudo mkdir -p rootfs/var/
sudo mkdir -p rootfs/mnt/

sudo cp etc rootfs/ -arf
sudo mkdir -p rootfs/lib

sudo cp -arf ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/

#python
version=3
sudo mkdir -p rootfs/usr
pushd rootfs/usr
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/lib .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/include .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/bin .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/share .
sudo aarch64-linux-gnu-strip lib/python*
popd

version=2
pushd rootfs/usr
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/lib .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/include .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/bin .
sudo cp  -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/share .
sudo aarch64-linux-gnu-strip lib/python*
popd

#sqlite
sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/bin/* rootfs/bin/
sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include/* rootfs/include/
sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib/* rootfs/lib/
sudo strip rootfs/bin/sqlite3

#readline
sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch64/include/* rootfs/include/
sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Readline/aarch64/lib/* rootfs/lib/

sudo mkdir -p rootfs/dev/
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3

sudo rm rootfs/lib/*.a
sudo rm rootfs/lib/*.la
sudo aarch64-linux-gnu-strip rootfs/lib/*

sudo mkdir -p rootfs/lib/modules/4\.10\.0\+

pushd rootfs/lib
sudo ln -sf ld-2.19-2014.07.so ld-linux-aarch64.so.1
popd

sudo mkdir -p rootfs/tools
sudo cp ./other_tools/* rootfs/tools

sudo dd if=/dev/zero of=ramdisk bs=1M count=300
sudo mkfs.ext4 -F ramdisk

sudo mkdir -p tmpfs
sudo mount -t ext4 ramdisk ./tmpfs/  -o loop
sudo cp -raf rootfs/*  tmpfs/
sudo umount tmpfs

sudo gzip --best -c ramdisk > ramdisk.gz
sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img


这里我把Python3和Python2都拷贝到板子上面了, 同时别忘了拷贝readline和termcap的lib和include。如果提示空间不够的话,修改第75行的count的数值,这个要不能大于kernel里配置的值。

6、验证

经测试,在板子板子上面使用python3或者python2的时候,按键盘的方向键不会乱码。



完。

修改Modules/Setup
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: