参考

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.0 和 Python-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-.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..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-.07_linux/bin:$PATH

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

修改Makefile

 --- Makefile.orgin    -- ::24.557379472 +
+++ Makefile -- ::32.749379210 +
@@ -, +, @@
srcdir = ../termcap-1.3.
VPATH = ../termcap-1.3. -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

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

编译安装 mk2_make.sh:

 #!/bin/bash

 export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-.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-.07_linux/bin:$PATH

 ../Python-3.6./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    -- ::52.609370903 +
+++ Setup -- ::46.781457397 +
@@ -, +, @@
# 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-.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./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    -- ::37.121275501 +
+++ Setup -- ::11.845441252 +
@@ -, +, @@
# 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-.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-.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-.07_linux/bin:$PATH

 sudo rm -rf rootfs
sudo rm -rf tmpfs
sudo rm -rf ramdisk* sudo mkdir rootfs
sudo cp ../busybox-1.24./_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

解决Python交叉编译后,键盘方向键乱码的问题的更多相关文章

  1. 解决python解析文件时输出乱码

    首先获取到json模块,encoding指定文件编码utf-8,errors报错时忽略错误,print()输出结果看看是否有问题. # -*- coding: utf-8 -*- import jso ...

  2. 解决Python查询Mysql数据库信息乱码问题

    今天尝试着用 Python 写了个脚本试着连接 mysql 数据库,并查询里边的数据,不过最终查询结果中文字符变成了ascii格式. 代码如下: #!/usr/bin/python #encoding ...

  3. 移动端解决input focus后键盘弹出,高度被挤压的问题

    //解决弹出键盘页面高度变化bug var viewHeight = window.innerHeight; //获取可视区域高度 $("input").focus(functio ...

  4. 如何解决python升级后yum报错

    当我们yum命令的时候,会提示 "File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ SyntaxEr ...

  5. 看透“0”、“1”逻辑,轻松解决Python中文乱码

    Python中关于"中文乱码"的问题,现规整如下,并统一回答 同学问: jacky:我在爬取XX网站信息的时候,中文怎么总是显示的乱码? jacky:UTF-8与GBK到底是个啥? ...

  6. 解决 python 读取文件乱码问题(UnicodeDecodeError)

    解决 python 读取文件乱码问题(UnicodeDecodeError) 确定你的文件的编码,下面的代码将以'utf-8'为例,否则会忽略编码错误导致输出乱码 解决方案一 with open(r' ...

  7. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

  8. 解决下载经过GZip压缩后的网页乱码问题

    目前很多网站默认采用GZip压缩,如果不进行解压缩,下载后生成的html页面打开后会出现中文乱码 乱码前: string url = "http://quote.eastmoney.com/ ...

  9. 解决Python向MySQL数据库插入中文数据时出现乱码

    解决Python向MySQL数据库插入中文数据时出现乱码 先在MySQL命令行中输入如下语句查看结果: 只要character_set_client character_set_database ch ...

随机推荐

  1. Java反射--基于ParameterizedType实现泛型类,参数化类型

    一.引子: 项目中使用Gson的反序列化将json转化成具体的对象,具体方法是: package com.google.gson;下的反序列化方法 public <T> T fromJso ...

  2. imperva—waf 敏感字段显现

    imperva WAF中看到的日志内容信息有些都是敏感的  比如登录登出的信息 如何调整敏感信息的现实方式,并可以自定义敏感字段? 这里添加字段就可以了 这样就将******转变为明文了

  3. 【CTF WEB】函数绕过

    函数绕过 <?php show_source(__FILE__); $c = "<?php exit;?>"; @$c.=$_GET['c']; @$filena ...

  4. RESET MASTER和RESET SLAVE使用场景和说明【转】

    [前言]在配置主从的时候经常会用到这两个语句,刚开始的时候还不清楚这两个语句的使用特性和使用场景. 经过测试整理了以下文档,希望能对大家有所帮助: [一]RESET MASTER参数 功能说明:删除所 ...

  5. Java基础84 javaBean规范

    1.javaBean的概述 1.javaBeam(咖啡豆)是一种开发规范,也可以说是一种技术.  2.JavaBean就是一个普通java类,只要符合以下规定才能称作为javaBean:        ...

  6. windows 2008 启用.NET Framework 3.5

    Win2008下已经集成了.NET 3.5.1 framework,需要在管理界面打开! 方法和步骤是: 服务器管理器 -> 功能 -> 添加功能 然后在“选择功能”界面勾选“.NET F ...

  7. django orm按天统计发布单数量

    夜深了,先上代码和数据,明天再实现可视化图表. from datetime import datetime, timedelta from django.http import JsonRespons ...

  8. svn导入项目和部署方面的相关问题

    前一阵子忙于部署项目的事情,在这个过程之中遇到了一些问题,查阅了相关资料解决了问题于是就决定分享给大家,可能会对大家有一定的帮助.我在下面中可能会提到dubbo的一些问题,dubbo是用于分布式的系统 ...

  9. Java中的String问题

    方式一:String a = “aaa” ; 方式二:String b = new String(“aaa”); 两种方式都能创建字符串对象,但方式一要比方式二更优.因为字符串是保存在常量池中的,而通 ...

  10. Codeforces 280C Game on Tree 期望

    Game on Tree 这种题好像在wannfly训练营讲过, 我怎么又不会写啦, 我好菜啊啊啊. 我们按每个点算贡献, 一个点有贡献就说明它是被选中的点, 那么它被选中的概率就为1 / depth ...